MySQL - предложение where для тройного вложенного выбора

0

Я пишу самый сложный запрос, который я лично когда-либо делал... и я застрял!

Здесь код:

SELECT 
    el.UID, 
    (
        SELECT 
            SUM(booked)  
        FROM 
            (
                SELECT 
                ts.*, max(ts.dateStored) 
                FROM eventsDetails ed 
                JOIN ticketSales ts ON ts.DUID = ed.UID 
                WHERE ed.event_masterEvent = 1147 
                GROUP BY ts.DUID
            ) a 
    ) as booked,
    el.event_confirmed, 
    el.event_title, 
    (
        SELECT 
            GROUP_CONCAT(g.colour) 
        FROM eventsGenre eg 
        JOIN genres g ON g.UID = eg.GUID 
        WHERE eg.EUID = el.UID
    ) AS genreCodes, 
    (
        SELECT 
            GROUP_CONCAT(g.genre) 
        FROM eventsGenre eg 
        JOIN genres g ON g.UID = eg.GUID 
        WHERE eg.EUID = el.UID
    ) AS genreNames 
FROM eventsList el 
JOIN eventsDetails ed ON el.UID = ed.event_masterEvent 
WHERE el.event_active='1' 
AND ed.event_eventDateAndTime >= CURDATE() 
GROUP BY el.UID 
ORDER BY ed.event_eventDateAndTime ASC

В строке "WHERE ed.event_masterEvent = 1147" я не могу изменить это на "WHERE ed.event_masterEvent = el.UID". 1147 было просто проверить, работает ли код... но теперь мне нужно ссылаться на общий идентификатор события.

Всякий раз, когда я это делаю, я получаю сообщение о том, что столбец не существует.

Я не понимаю, потому что в дальнейшем по запросу я могу сказать "WHERE eg.EUID = el.UID" в подборе.

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

У меня такое чувство, что мне нужно добавить еще одно соединение, но я не могу понять, где. Я попытался найти ответ, но я не совсем уверен, какие условия поиска использовать, поэтому я не очень далеко.

Любая помощь будет принята с благодарностью!

Вот сценарий проблемы: http://sqlfiddle.com/#!9/c77a98/2

  • 0
    Я не понимаю, зачем вам этот вложенный SELECT . Какой смысл в неиспользованном MAX(ts.dateStored) ?
  • 0
    Если вы пытаетесь получить booked значение в последнем ts.dateStored для каждого DUID , это не правильный путь. Посмотреть строку с максимальным значением столбца
Показать ещё 6 комментариев
Теги:

1 ответ

1
Лучший ответ

Вывешенный вами запрос грубо перегружен и может быть значительно более читаемым, если вы используете некоторые JOIN.

Мне удалось переписать (непроверенную) большую часть вашего запроса, как показано ниже, но я не уверен в рефакторинг booked части, потому что не ясно, чего вы пытаетесь достичь, не имея надежной схемы и выборочных данных для ссылки.

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

SELECT 
    el.UID,
    el.event_confirmed, 
    el.event_title, 
    GROUP_CONCAT(DISTINCT g.genre SEPARATOR ', ') AS genreNames,
    GROUP_CONCAT(DISTINCT g.colour SEPARATOR ', ') AS genreCodes,
    SUM(ts.booked) AS booked
FROM eventsList el
INNER JOIN eventsDetails ed ON (el.UID = ed.event_masterEvent AND ed.event_eventDateAndTime >= CURDATE())
LEFT JOIN eventsGenre eg ON (el.UID = eg.EUID)
LEFT JOIN genres g ON (eg.GUID = g.UID)
LEFT JOIN (
    SELECT ts.*, MAX(ts.dateStored)
    FROM eventsDetails ed 
    INNER JOIN ticketSales ts ON ts.DUID = ed.UID 
    GROUP BY ts.DUID
) AS ts ON (ed.UID = ts.DUID)
WHERE el.event_active = 1
AND el.UID = 1147
GROUP BY el.UID
ORDER BY ed.event_eventDateAndTime ASC;
  • 0
    Вам, вероятно, следует использовать DISTINCT в GROUP_CONCAT , иначе вы получите дублирование из-за дополнительного соединения. Но этот ответ не решает реальную проблему в его запросе, а именно, как получить booked значения, которые он хочет.
  • 0
    Хороший звонок на DISTINCT . Я понимаю, что это не отвечает на его вопрос прямо сейчас, но отправленный им запрос - беспорядок, поэтому я попытался упростить его, и с некоторой дополнительной информацией от OP я могу ответить и на его вопрос. Но, как я сказал в своем ответе, он может принять это или оставить.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню