Mysql 获取3表联接以返回预期结果的困难
我很难弄清这个sql查询的底细 表:Mysql 获取3表联接以返回预期结果的困难,mysql,join,Mysql,Join,我很难弄清这个sql查询的底细 表: --Tickets-- --Finance-- --Access-- id_tickets id_finance id_access name_tickets id_event id_event cat_tickets id_tickets id_tickets sold_f
--Tickets-- --Finance-- --Access--
id_tickets id_finance id_access
name_tickets id_event id_event
cat_tickets id_tickets id_tickets
sold_finance scan_access
Finance和Access都包含一行,表示票证中列出的每种票证类型的倍数。
我正试图得到:
cat_tickets | total_sold | total_scan
-------------------------------------
single | 3043 | 2571
season | 481 | 292
comp | 114 | 75
-------------------------------------
total | 3638 | 2938
最接近我使用过的结果:
SELECT tickets.cat_tickets, COALESCE(SUM(finance.sold_finance), 0) AS total_sold, COALESCE(SUM(access.scan_access), 0) AS total_scan
FROM finance INNER JOIN tickets ON finance.id_tickets = tickets.id_tickets
INNER JOIN access ON access.id_tickets = tickets.id_tickets
WHERE access.id_event = 235 AND finance.id_event = access.id_event
GROUP BY tickets.cat_tickets
ORDER BY tickets.cat_tickets DESC
但这只是返回:
cat_tickets | total_sold | total_scan
-------------------------------------
single | 4945 | 4437
season | 954 | 599
comp | 342 | 375
-------------------------------------
total | 6241 | 5411
你知道我哪里会出错吗?
谢谢 虽然我完全清楚您想要什么,但如果查询结果符合您的期望,请尝试此查询
SELECT tickets.cat_tickets, COALESCE(SUM(finance.sold_finance), 0) AS total_sold, COALESCE(SUM(access.scan_access), 0) AS total_scan
FROM finance LEFT JOIN tickets ON finance.id_tickets = tickets.id_tickets
LEFT JOIN access ON access.id_tickets = tickets.id_tickets
WHERE access.id_event = 235
GROUP BY tickets.cat_tickets
ORDER BY tickets.cat_tickets DESC
免责声明:由于问题数据不完整,此查询未经测试
问题是
access
和finance
表之间的关系,您必须join
它们。即使您LEFT JOIN
该表,谓词finance.id\u event=access.id\u event
也将使其成为内部联接。作为一种解决方法,请像这样使用UNION
:
SELECT
tickets.cat_tickets,
SUM(CASE WHEN a.Type = 'f' THEN num ELSE 0 END) AS total_sold,
SUM(CASE WHEN a.Type = 'a' THEN num ELSE 0 END) AS total_scan
FROM tickets
LEFT JOIN
(
SELECT 'f' Type, id_tickets, sold_finance num
FROM finance f
WHERE id_event = 1
UNION ALL
SELECT 'a', id_tickets, scan_access
FROM access
WHERE id_event = 1
) a ON a.id_tickets = tickets.id_tickets
GROUP BY tickets.cat_tickets;
不清楚表之间是如何关联的。我尝试过(在添加正确的事件id后),但结果也不正确。这是类似的错误,我得到虽然略有不同的几个数字优秀!“变通”是如何运作的?这种方法有局限性吗?到底发生了什么事?@AlanDoolan我将两个表中的所有数据合并到一个查询中,这个查询是连接的子查询,新列Type
用作标志,f
用于来自财务表的查询,a
用于来自访问表的查询。然后我在外部查询中使用了LEFT JOIN
来获取所有票证,不管它在另外两个表中是否有行,那么有三种情况:一种情况是,如果票证在两个表中没有行,那么两个和将为0,因为类型将为NULL
因此为0。@AlanDoolan Second,如果票据仅在财务中有行,则类型
将为f
,然后它将对售出的\u财务
的值求和。第三,如果票据仅在访问中有行,则类型
将为a
,然后它将仅对扫描访问
的值求和。这就是CASE
表达式所做的……解释比答案更令人困惑。好吧,我想我有很多关于sql术语的学习。非常感谢!我尝试过测试它,但出现了错误,不知道sql,我不知道如何修复它。我一直在更改项目,但不确定我在做什么
SELECT
tickets.cat_tickets,
SUM(CASE WHEN a.Type = 'f' THEN num ELSE 0 END) AS total_sold,
SUM(CASE WHEN a.Type = 'a' THEN num ELSE 0 END) AS total_scan
FROM tickets
LEFT JOIN
(
SELECT 'f' Type, id_tickets, sold_finance num
FROM finance f
WHERE id_event = 1
UNION ALL
SELECT 'a', id_tickets, scan_access
FROM access
WHERE id_event = 1
) a ON a.id_tickets = tickets.id_tickets
GROUP BY tickets.cat_tickets;