我有一个简单的表,有4个字段:
indexID
UserID
text_1
IsFinal
此表格可能包含每个UserID
的多个值,而IsFinal
字段只能包含一个值1或0。
我要做的是创建一个select语句,如果IsFinal
只等于0,将返回用户ID。问题可能是同一个userID有多个记录,有些记录有{{1} }等于0且只有1 IsFinal
等于1。
我的问题在于:对于每个IsFinal
,如果它有UserID
的记录,我想忽略具有相同Isfinal = 1
的所有记录,否则我想要返回它记录。我不知道是否只能通过SQL语句来完成。
答案 0 :(得分:2)
好像你想要反连接,即首先需要确定哪些用户ID有IsFinal = 1
,然后使用该结果集返回所有用户ID 不< / em>在该列表中。
有多种方法可以实现反连接。
NOT IN
:
SELECT *
FROM atable
WHERE UserID NOT IN (
SELECT UserID
FROM atable
WHERE IsFinal = 1
);
NOT EXISTS
:
SELECT *
FROM atable t1
WHERE NOT EXISTS (
SELECT *
FROM atable t2
WHERE t1.UserID = t2.UserID
AND t2.IsFinal = 1
);
LEFT JOIN
+ WHERE IS NULL
:
A)
SELECT *
FROM atable t1
LEFT JOIN (
SELECT *
FROM atable
WHERE IsFinal = 1
) t2 ON t1.UserID = t2.UserID
WHERE t2.UserID IS NULL;
b)中
SELECT *
FROM atable t1
LEFT JOIN atable t2
ON t1.UserID = t2.UserID AND t2.IsFinal = 1
WHERE t2.UserID IS NULL;
可能会发生这样的情况:它们在您的数据库中同样有效,但是测试它们中的每一个仍然可能是一个好主意,至少要避免最终会遇到性能比其他数据更差的数据。
答案 1 :(得分:0)
我认为这就是你要找的东西:
SELECT a.*
FROM translations a
INNER JOIN (SELECT UserID FROM translations WHERE IsFinal = 1) b
ON a.UserID = b.UserID
WHERE IsFinal = 0;
答案 2 :(得分:0)
尝试(未测试)
SELECT t1.* FROM table t1
INNER JOIN table t2 USING(indexID)
WHERE t1.IsFinal <>1
GROUP BY t1.UserID