2015-01-19 6 views
1

упрощенный пример проблемы, я пытаюсь решить:Mysql агрегирование данных с тем, если оператор

EDIT - С ПК

sqlfiddle: http://sqlfiddle.com/#!2/7be5d/1

---

У меня есть две таблицы:

People 
-------- 
| Name | 
-------- 
| Mike | 
| Jim | 
| Fred | 
-------- 


HasBanana 
------------------------ 
| Name | Has_a_banana | 
------------------------ 
| Mike | N   | 
| Mike | N   | 
| Mike | N   | 
| Mike | N   | 
| Mike | Y   | 
| Mike | N   | 
| Jim | N   | 
| Jim | N   | 
| Jim | Y   | 
| Jim | N   | 
| Jim | N   | 
| Fred | N   | 
| Fred | N   | 
| Fred | N   | 
| Fred | N   | 
| Fred | N   | 
| Fred | N   | 
------------------------ 

И запрос:

select * from People 
left join HasBanana on HasBanana.name = People.name; 

Это создает таблицу точно так же, как таблица HasBanana выше. То, что я хотел бы создать, - это таблица, сгруппированная по People.name и показывающая Y, если человек когда-либо был отмечен как имеющий банан.

Так что-то вроде этого:

HadBanana 
------------------------ 
| Name | Had_a_banana | 
------------------------ 
| Mike | Y   | 
| Jim | Y   | 
| Fred | N   | 
------------------------ 

Я знаю, что я могу использовать следующее группировать по имени

group by people.name; 

, но возникают проблемы, делающие логику сказать для каждого имени, если has_a_banana никогда не было Y затем установите has_a_banana в Y.

+0

У вас нет рк. это проблематично – Strawberry

+0

@Strawberry Я не разместил реальный стол, с которым я действительно работаю. Только упрощенная таблица, чтобы проиллюстрировать мою точку зрения. Будет добавлен один, хотя если это действительно необходимо для решения ... – onmylemon

ответ

1
select 
    p.name 
    , case when x.name is null then 'N' else 'Y' end as had_a_banana 
from people p 
left outer join 
(
    select 
    name 
    from bananas 
    where has_a_banana = 'Y' 
    group by name 
) x 
on x.name = p.name 
group by p.name, x.name 

Я проверил это, используя ссылку SQLFiddle, хотя ваши данные Fiddle не соответствуют вашему вопросу, поэтому я получаю:

Fred N 
Jim Y 
Mike N 

(что похоже на данные вашего Fiddle).

+0

Thats perfect, они оба были случайным образом застряли в данных. Теперь, чтобы попробовать интегрировать это в запрос, с которым я работаю ... желаю удачи! – onmylemon

+0

GROUP BY без агрегирующих предложений? Производительность в сторону, я не думаю, что мы должны поощрять это! – Strawberry

+0

@Strawberry Что такое агрегирующие предложения для группы? Ссылки на любые материалы для чтения были бы замечательными :-) – onmylemon

0

select people.id, people.name, case a.has_a_banana when 'Y' then 'Y' else 'N' end as has_a_banana from people 
left join 
(select people.id, people.name, bananas.has_a_banana from people 
left join bananas on bananas.name = people.name 
where has_a_banana = 'Y' 
group by people.name) as a 
on a.name = people.name 

позволит вам получить то, что вы хотите.

1

Alternative (немного уродливым раствора):

select people.name, max(has_a_banana) from people 
left join bananas on bananas.name = people.name 
group by people.name; 
Смежные вопросы