mysql - 两个表之间的条件语句

标签 mysql

我有两张 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

最佳答案

您想要的是一起查看 EVENTSORDERS 表,以便构成 JOIN。但是,由于您想要所有事件,无论是否下订单,因此您希望它是LEFT JOIN。如果您执行了INNER JOIN,那么您最终只会得到发生订单的事件,而不是所有事件。所以现在,您的查询将如下所示:

SELECT *
FROM events e
    LEFT JOIN orders o

eventsorders 将在 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_timeend_time),则需要将它们添加到 SELECT AND GROUP BY 部分。

关于mysql - 两个表之间的条件语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149989/

相关文章:

PHP PDO 获取对象转换为字符串

php - Mysql查询的问题

mysql - 在 sql 语句中使 where 子句可选

php - Smarty foreach mysql 问题

mysql - 为什么带有 CAST、CONVERT 和 FORMAT 的 SELECT 行不起作用?

mysql - 我可以在商业环境中在 MySQL Community 上托管 WordPress

PHP 基于 $interval 循环 X 次,但是如何处理剩余值?

php - '@' 创建一个允许我标记的评论框

c# - 消息队列异常 : Queue does not exist or you do not have sufficient permissions to perform the operation

mysql - 如何选择具有 MAX(日期) 的行并将每一行与之前的价格连接起来