У меня есть таблица MySQL, которая настроена примерно так

id, eventid, event                           , venue    , performer      , popular, image
 2, 5895   , Garth Brooks and Trisha Yearwood, TD Garden, Trisha Yearwood, n      , empty
 1, 5895   , Garth Brooks and Trisha Yearwood, TD Garden, Garth Brooks   , y      , garth.jpg

На каждом мероприятии в базе данных есть строчка для каждого исполнителя. Что мне нужно сделать, так это SELECT * FROM events_table WHERE venue = 'TD Garden', но мне нужно сгруппировать их по идентификатору события, иначе появятся несколько строк одного и того же события.

Проблема в том, что мне нужно как-то сгруппировать их с приоритетом в строках, где popular = y. Иначе могла бы появиться Триша Йервуд, и у нее не было бы фото. Причина, по которой я не выбираю просто все, где популярно = y, заключается в том, что на некоторых мероприятиях может не быть с самого начала каких-либо популярных артистов, и мне понадобятся все мероприятия в TD Garden, а не только популярные.

Возможно ли то, что я прошу, с SQL? Извините, если мой вопрос слишком запутанный.

0
eric212 17 Дек 2014 в 19:21

3 ответа

Лучший ответ

Подзапрос выбирает максимальную популярность каждого мероприятия ('y'> 'n'), поэтому условие (eventid,popular) in (...) удаляет строки для артистов, которые не имеют максимальной популярности в мероприятии, где они выступают.

select *
from events_table
where
    venue = 'TD Garden' and
    (eventid,popular) in (
        select
            eventid,
            max(popular)
        from events_table
        group by eventid
    )
group by eventid
0
user4003407 28 Янв 2015 в 02:14
SELECT  ET.ID, ET.Event_ID, ET.Event, ET.Venue, Coalesce(ET2.Performer, ET.Performer) as Performer Coalesce(ET2.Popular, ET.Popular) as Popular, Coalesce(ET2.Image, ET.Image) as Image
FROM events_table ET
LEFT JOIN Events_table ET2 
 on ET.Event_ID = ET2.Event_ID
 and ET2.Popular='Y'
WHERE venue = 'TD'

Это может быть то, что вам нужно, но это не очень хорошо для нескольких популярных людей. Я также не знаю, какие имена вы хотите отобразить, только популярное имя или должны быть указаны оба исполнителя ....

0
xQbert 17 Дек 2014 в 17:04

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

Select [columns here] From 
    (Select [columns here] From events_table ET where venue='your_venue_here' and 
        (popular='y' or not exists
            (Select * From events_table where popular='y' and eventid=ET.eventid)) T
group by eventid
0
madz 17 Дек 2014 в 17:29