mysql连接成对相关的3个表

时间:2017-08-14 16:35:10

标签: php mysql join

►背景:我在博物馆工作(真实的),人们每天都来,他们为自己(人类)购买门票,有时他们也会购买饮料和食品(物品)的门票。有活动,门票每个活动都有同名,但价格不同。

►问题:我必须创建一个包含2个结果的报告:总销售额(访客+食品+饮料)和有多少人 strong>(仅限访客)特定活动。接下来是数据库中3个表的图像,它们之间的关系以及一些样本数据:

  • 表格票据通过 EVENT_ID 列与SALES_MAIN相关。
  • 表SALES_MAIN通过 ID MAIN_ID 列与SALES_DETAIL相关。
  • 表SALES_DETAIL有一列 TICKET_NAME ,但在表TICKETS中并不是唯一的。

enter image description here

►问题:如何在一个“选择”中获得 555 的结果总销售额和人数?我尝试了下一步2“选择”,但当我将它们与另一个INNER JOIN结合时,我得到了笛卡尔结果:

获取 555

活动的详细信息销售额
SELECT sales_detail.* FROM sales_main
INNER JOIN sales_detail ON sales_detail.main_id = sales_main.id
WHERE sales_main.event_id = '555'

获取活动门​​票 555

SELECT * FROM tickets WHERE tickets.event_id = '555'

1 个答案:

答案 0 :(得分:3)

使用:

SELECT 
  SUM(CASE WHEN sd.ticket_name IN ('adult', 'child') THEN sd.quantity 
           ELSE 0 END) AS total_visitors,
  SUM(sd.quantity * t.price)  AS total_sales
FROM sales_main sm
JOIN sales_detail sd
  ON sd.main_id = sm.id
JOIN ticket t
  ON t.event_id = sm.event_id
 AND t.ticket_name = sd.ticket_name
WHERE sm.event_id = '555';

条件聚合也可以基于类型:

SUM(CASE WHEN t.ticket_type ='human' THEN sd.quantity ELSE 0 END)