Mysql 获取3表联接以返回预期结果的困难

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

我很难弄清这个sql查询的底细

表:

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