У меня есть таблица 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
2
Вы можете группировать по произвольным значениям, например. group by popular = 'y', other,fields,here
 – 
Marc B
17 Дек 2014 в 19:25
Рассмотрите возможность предоставления более тщательно репрезентативного набора данных (в идеале в виде набора DDL) и желаемого набора результатов.
 – 
Strawberry
17 Дек 2014 в 19:31
Я не уверен, что понимаю ваш пример. Вы хотите, чтобы изображение Гарта показывалось для Триши Йервуд? или вы хотите, чтобы в списке был только Гарт, так как он популярен... Что, если популярно несколько?
 – 
xQbert
17 Дек 2014 в 20:02
Я бы хотел, чтобы в списке был только Гарт, так как он популярен. Если есть два популярных артиста, не имеет большого значения, какое изображение будет показано, но шансы на то, что будут два популярных артиста, невелики.
 – 
eric212
17 Дек 2014 в 20:17

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 в 05: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 в 20: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 в 20:29