我有两张 table 。
一个包含事件
,列:
id, start_time, end_time, location_id
另一个带有订单
,列:
id, time_placed, location_id
基本上,我想要的是一个包含所有事件的新表和一个包含该事件的订单数的新列。我对这些订单进行分组的方式将取决于它们是否放置在事件的开始时间和结束时间之间,以及它们是否与事件共享相同的 location_id。我对如何做到这一点感到非常困惑。每个事件都有自己的唯一 ID,每个订单都有自己的唯一 ID。
由于表的大小,我无法真正将表导出到 csv 并在 Python 中尝试任何操作,因此必须在 mySQL 中完成。
我尝试过探索 CASE 语句和循环,但我尝试的任何方法都不起作用,所以我可能做错了。
所以我最终想要的是一个包含变量的表: event_id 和 order_count。
id order_count
1 7383
2 383
3 83838
最佳答案
您想要的是一起查看 EVENTS
和 ORDERS
表,以便构成 JOIN
。但是,由于您想要所有事件
,无论是否下订单,因此您希望它是LEFT JOIN
。如果您执行了INNER JOIN
,那么您最终只会得到发生订单的事件,而不是所有事件。所以现在,您的查询将如下所示:
SELECT *
FROM events e
LEFT JOIN orders o
events
和 orders
将在 location_id
上连接,因此您将其添加到 ON
子句中连接:
SELECT *
FROM events e
LEFT JOIN orders o
ON e.location_id = o.location_id
由于订单也是根据时间关联的,因此您还需要将其添加到 ON
子句中:
SELECT *
FROM events e
LEFT JOIN orders o
ON e.location_id = o.location_id
AND e.start_time <= o.time_placed -- event starts before/at order
AND e.end_time >= o.time_placed -- event ends after/at order
这将正确连接表。接下来您需要将它们分组。由于您希望通过 event
获得它,因此您将在 `id:
event
列上进行分组
SELECT *
FROM events e
LEFT JOIN orders o
ON e.location_id = o.location_id
AND e.start_time <= o.time_placed -- event starts before/at order
AND e.end_time >= o.time_placed -- event ends after/at order
GROUP BY e.id
最后,使用您想要的字段填充 SELECT
,使用 COUNT
获取每个事件的订单数:
SELECT e.id,
COUNT(o.id) AS order_count
FROM events e
LEFT JOIN orders o
ON e.location_id = o.location_id
AND e.start_time <= o.time_placed -- event starts before/at order
AND e.end_time >= o.time_placed -- event ends after/at order
GROUP BY e.id
如果您需要 events
表中的其他字段(start_time
、end_time
),则需要将它们添加到 SELECT
AND GROUP BY
部分。
关于mysql - 两个表之间的条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149989/