MySQL - 三重嵌套选择

时间:2018-03-14 22:34:34

标签: mysql sql

我正在编写我个人曾经做过的最复杂的查询...而且我被卡住了!

以下是代码:

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

1 个答案:

答案 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;