MySQL - 从不在日期之间的 INNER JOIN 获取记录

MySQL - Get records from INNER JOIN not between dates

我有两个表

帐户:

+------------+--------+
| accountsid | name   |
+------------+--------+
|          1 | Bob    |
|          2 | Rachel |
|          3 | Mark   |
+------------+--------+

销售订单

+--------------+------------+------------+--------+
| salesorderid | accountsid | so_date    | amount |
+--------------+------------+------------+--------+
|            1 |          1 | 2015-12-16 |     50 |
|            2 |          1 | 2016-01-13 |     20 |
|            3 |          2 | 2015-12-14 |     10 |
|            4 |          3 | 2016-02-14 |     35 |
+--------------+------------+------------+--------+

如您所见,是一个 1-N 关系,其中 Accounts 有很多 Salesorder,而 Salesorder 有 1 个 Account。

我需要检索 "old" 个不再活跃的帐户。例如,如果某些帐户在 2016 年没有销售订单,则该帐户为非活动帐户。

因此,在此示例中,结果将只有 Rachel。

我怎样才能找回这个?我认为它介于 "opposite" 之间,但我不知道该怎么做...

谢谢。

PS。尽管有标题,但我可以在没有 INNER JOIN 的情况下获得它。

为什么只需要使用内连接?内部联接适用于两个表上有数据匹配的情况,但在这种情况下,您不需要使用带有 "not in" 或 "not exists"

的子查询

你想要的是获取没有下单的id,所以获取下单的id,剩下的就是没有下单的id。

应该是这样的SELECT * FROM Accounts WHERE accountsid NOT IN (SELECT accountsid FROM Sales Orders WHERE so_date > your_date)

您要实现 anti-join,MySQL 中有三种可能性:

  1. 使用NOT IN:

    SELECT a.*
    FROM   Accounts a
    WHERE  a.accountsid NOT IN (
             SELECT so.accountsid
             FROM   `Sales Orders` so
             WHERE  so.so_date >= '2016-01-01'
           )
    
  2. 使用NOT EXISTS:

    SELECT a.*
    FROM   Accounts a
    WHERE  NOT EXISTS (
             SELECT *
             FROM   `Sales Orders` so
             WHERE  so.accountsid = a.accountsid
                AND so.so_date >= '2016-01-01'
           )
    
  3. 使用外层 JOIN:

    SELECT a.*
    FROM   Accounts a LEFT JOIN `Sales Orders` so
        ON so.accountsid = a.accountsid
       AND so.so_date >= '2016-01-01'
    WHERE  so.accountsid IS NULL