繁体   English   中英

SQL查询在同一列上实现多个WHERE条件

[英]SQL query to implement multiple WHERE condition on same column

我有两个表,tbl1和tbl2如下:

CREATE TABLE tbl1 (`uid` int);

INSERT INTO tbl1 (`uid`)
VALUES
    (100),
    (200),
    (300),
    (400);

CREATE TABLE tbl2 (`id` int, `uid` int, `status` int);

INSERT INTO tbl2 (`id`, `uid`, `status`)
VALUES
    (1, 100, 0),
    (2, 100, 1),
    (3, 100, 2),
    (4, 100, 4),
    (5, 200, 0),
    (6, 200, 1),
    (7, 300, 0),
    (8, 300, 3),
    (9, 300, 4),
    (10, 400, 1),
    (11, 400, 2);

SQLFIDDLE: http ://sqlfiddle.com/#!2/1a6c20/13

问题:我想加入这两个表。 结果应显示tbl2.status = 0但tbl2.status = 1的行。

这是我要运行的SQL查询:

SELECT DISTINCT tbl1.uid, tbl2.id, tbl2.status 
FROM tbl1
INNER JOIN tbl2 ON (tbl1.uid = tbl2.uid)
WHERE tbl2.status = 0
OR tbl2.status <> 1;

CORRECT预期的结果是: 7, 300, 0

此处,uid = 300包含状态为= 0的行,而此uid = 0没有状态为= 1的行。 所以这是我想要的预期结果。

uid=100 has both status=0 and status=1, so this is not the required result.
uid=200 also has both status=0 and status=1 so this is not the required result.
uid=400 does not have status=0, this is not the required result.

请帮助!!!

您需要选择status = 0的uids,但不要选择状态= 1的表中显示的uid。 因此,您需要将它们从结果集中排除。 您的where子句中还需要一个条件才能获得预期的结果。 这可以通过使用NOT IN来完成。

尝试以下查询

SELECT  tbl1.uid, tbl2.id, tbl2.status 
 FROM tbl1
INNER JOIN tbl2 ON (tbl1.uid = tbl2.uid)
WHERE tbl2.status = 0
and tbl2.uid NOT IN (SELECT uid from tbl2 where status=1);

你可以使用NOT EXISTS子句

SELECT DISTINCT T1.uid, T2.id, T2.status 
FROM tbl1 T1
INNER JOIN tbl2 T2 ON (T1.uid = T2.uid)
WHERE T2.status = 0
AND NOT EXISTS ( SELECT 1 FROM tbl2 T22
                 where T2.uid = T22.uid
                 and T22.status =1 )

去掉

OR tbl2.status <> 1

这是不合逻辑的(如果列等于0则它不能等于1)并且混淆查询。

如果你想要所有唯一的uid s,其中status等于0,但永远不等于1,那么使用带有AND逻辑的子查询;

WHERE tbl2.status = 0
AND tbl2.uid NOT IN (SELECT uid FROM tbl2 WHERE status=1)

这将选择status等于0的所有行,然后删除同一uidstatus等于1的行。这将为您提供在问题中给出的预期结果。

如果要 status等于1的行以外的所有行,请使用;

WHERE tbl2.status <> 1

这给出了与当前查询完全相同的结果, tbl2.status = 0无关紧要。

WHERE子句中的OR存在逻辑错误。

子句WHERE tbl2.status = 0产生所需的结果:

(7, 300, 0)

子句OR tbl2.status <> 1产生

(7, 300, 0)
(8, 300, 3)
(9, 300, 4)

因为这是一个OR,所以联合被采用,你得到所有三个元组。

不熟悉SQL的人经常发现OR很棘手。 当一个意想不到的结果让我感到困惑时,我常常把真值表放在我附近

放OR是没有意义的,只需删除OR部分并试试这个:

SELECT DISTINCT tbl1.uid, tbl2.id, tbl2.status 
FROM tbl1
INNER JOIN tbl2 ON (tbl1.uid = tbl2.uid)
WHERE status = 0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM