背景:我在一家博物馆工作(真的),人们每天都来,他们为自己(人类)买票,有时还为饮料和食品(物品)买票。有些活动,每个活动的门票名称相同,但价格不同。
问题:我必须创建一份报告,报告中包含两个结果:总销售额(访客+食品+饮料)和某个特定活动的访客数量(仅限访客)。接下来是数据库中3个表的图像、它们之间的关系以及一些示例数据:
表票证与SALES_MAIN through EVENT_ID列相关。
表SALES_MAIN通过ID→MAIN_ID列与SALES_DETAIL相关。
表SALES_DETAIL有一个列TICKET_NAME,但它在表TICKET s中不是唯一的。
php - mysql连接成对相关的3张表-LMLPHP
问题:如何在一个“选择”中同时获得事件555的结果、总销售额和人工计数?我尝试了下一个2“select”,但是当我将它们与另一个内部连接组合时,得到了笛卡尔结果:
获取活动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/

10-14 14:01