我有3张桌子。
Users:
id__| login__
--------------
_1__| root
_2__| admin
_3__| user
Table 1
id__ | name__ | data_
---------------------
1____| name1__| data1
2____| name2__| data2
3____| name3__| data3
4____| name4__| data4
Table2
id__ | table1_id_| user_id
---------------------------
1____| ____3_____| ___3___
2____| ____2_____| ___3___
3____| ____2_____| ___1___
4____| ____3_____| ___1___
我想知道'和'数据'来自table1除了来自table2的属于users.id = 3的ids,这意味着我需要得到这个: 表结果(table1中的所有字段)(user_id = 3的结果)(对于user_id = 1的结果,btw必须相同):
期望的输出:
id__| name__ | data_
--------------------
1___| name1__| data1
4___| name4__| data4
---------------------
我应该使用什么SQL查询?
答案 0 :(得分:2)
虽然您可以使用NOT IN
解决此问题,但我建议改为使用NOT EXISTS
:
SELECT t1.*
FROM table1 t1
WHERE NOT EXISTS (SELECT 1
FROM table_2 t2
WHERE t2.table1_id = t1.id AND t2.user_id = 3
);
为什么呢?如果任何 NOT IN
值为table1_id
,则NULL
会表现得相当奇怪。如果发生这种情况,则NOT IN
仅返回false并NULL
- never 返回true。因此,即使一个列值为NULL
,也不会返回任何行。
NOT EXISTS
表现得更直观,因此您不必担心这种情况。
答案 1 :(得分:0)
如果我理解正确,这应该是你想要的:
SELECT * FROM table1 WHERE id NOT IN (SELECT table1_id FROM table2 WHERE user_id = 3);