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

时间:2016-01-11 15:46:24

标签: mysql date range between

我有两张桌子

账户:

+------------+--------+
| 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有许多Salesorders,Salesorder有1个帐户。

我需要检索不再有效的“旧”帐户。例如,如果某个帐户在2016年没有销售订单是非活动帐户。

因此,在这个例子中,结果只是Rachel。

我该如何检索?我认为它是两者之间的“对立面”,但我不知道该怎么做......

感谢。

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

3 个答案:

答案 0 :(得分: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
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你想要的是获得没有订单的ID,所以得到订单的ID,其余的是没有订单的。

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