我正在编写我个人曾经做过的最复杂的查询...而且我被卡住了!
以下是代码:
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只是为了测试代码的工作原理......但现在我需要引用整个事件ID。
每当我这样做时,我都会收到错误消息,说明该列不存在。
我不明白,因为在查询的后面,我可以在子选择中说“WHERE eg.EUID = el.UID”。
我不知道我做错了什么......就像我之前说过的那样,我现在非常不在我的舒适区,并且正在寻找一些MySQL专家来解释我在哪里出了问题。
我有一种感觉,我需要在某处添加另一个连接,但我无法解决问题。我试图寻找答案,但我不确定要使用哪些搜索条件 - 所以我不会走得太远。
非常感谢任何帮助!
这是问题的一个小提琴:http://sqlfiddle.com/#!9/c77a98/2
答案 0 :(得分: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;