【问题标题】:MySQL - Get records from INNER JOIN not between datesMySQL - 从 INNER JOIN 获取不在日期之间的记录
【发布时间】:2016-01-11 15:46:23
【问题描述】:

我有两张桌子

帐户:

+------------+--------+
| 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。

我需要检索不再处于活动状态的“旧”帐户。例如,如果某个帐户在 2016 年没有 Salesorder,则为非活动帐户。

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

我怎样才能找回这个?我认为这是两者之间的“对立面”,但我不知道该怎么做......

谢谢。

PS。尽管标题我可以在没有 INNER JOIN 的情况下得到这个。

【问题讨论】:

  • 请在没有JOIN的情况下发布您当前的代码。

标签: mysql date range between


【解决方案1】:

您希望实现反连接,在 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
    

【讨论】:

  • 嗨,我会研究最后一个例子,非常有趣。谢谢!
【解决方案2】:

为什么只需要使用内连接?内连接适用于您在两个表上有数据匹配的情况,但在这种情况下,您不需要使用带有“不在”或“不存在”的子查询

【讨论】:

  • 您应该这样做:从不存在的帐户 a 中选择帐户 ID(从销售 s 中选择 1,其中 s.accountsid = a.accountsid 和 so_date >= '2016-01-01');
  • 嗯,谢谢,我用“PS”编辑过,我会更深入地研究这个!
【解决方案3】:

您想要的是获取未下订单的 id,因此获取已下订单的 id,其余的是未下订单的 id。

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

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2016-09-21
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多