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 中有三种可能性:
使用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'
)
使用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'
)
使用外层 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
我有两个表
帐户:
+------------+--------+
| 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 中有三种可能性:
使用
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' )
使用
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' )
使用外层
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