php - mysql连接3个成对相关的表

标签 php mysql join

► 背景:我在博物馆工作(确实如此),人们每天都来,他们为自己(人类)购买门票,有时他们也购买饮料和食物(物体)的门票。有一些事件,每个事件的门票名称相同,但价格不同。

► 问题:我必须创建一个包含 2 个结果的报告:总销售额(访客 + 食物 + 饮料)和来了多少人针对特定事件的strong>(仅限访客)。接下来是数据库中 3 个表的图像、它们的关联方式以及一些示例数据:

  • 表 TICKETS 通过 EVENT_ID 列与 SALES_MAIN 相关。
  • 表 SALES_MAIN 通过 IDMAIN_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'

最佳答案

用途:

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)

关于php - mysql连接3个成对相关的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45679064/

相关文章:

php - 无法从 webservice ionic 框架检索数据

python - 事务回滚

javascript - 单击 php 页面中的那个 div 时如何隐藏标题 "City"?

php - Jquery 试图访问一个 php 数组并检查其中的内容

php - Apache mod_deflate 和 zlib.output_compression

PHP if 语句与 MySQL 查询

php - MySQL查询交叉引用

MySQL 合并两个表的结果

MySQL如何查询客户但在名字和姓氏匹配时跳过

PHP:如何解析相对 URL