Я пишу самый сложный запрос, который я лично когда-либо делал... и я застрял!
Здесь код:
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
Вывешенный вами запрос грубо перегружен и может быть значительно более читаемым, если вы используете некоторые 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;
DISTINCT
в GROUP_CONCAT
, иначе вы получите дублирование из-за дополнительного соединения. Но этот ответ не решает реальную проблему в его запросе, а именно, как получить booked
значения, которые он хочет.
DISTINCT
. Я понимаю, что это не отвечает на его вопрос прямо сейчас, но отправленный им запрос - беспорядок, поэтому я попытался упростить его, и с некоторой дополнительной информацией от OP я могу ответить и на его вопрос. Но, как я сказал в своем ответе, он может принять это или оставить.
SELECT
. Какой смысл в неиспользованномMAX(ts.dateStored)
?booked
значение в последнемts.dateStored
для каждогоDUID
, это не правильный путь. Посмотреть строку с максимальным значением столбца