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

时间:2014-10-22 18:36:18

标签: mysql sql

我有两个表,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有一行status = 0,这个uid = 0没有status = 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.

请帮助!!!

5 个答案:

答案 0 :(得分:3)

您需要选择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);

答案 1 :(得分:2)

您可以使用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 )

答案 2 :(得分:1)

删除

OR tbl2.status <> 1

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

如果您希望uid等于0,但永远不等于1的所有唯一status,则使用带有AND逻辑的子查询;

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

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

如果您希望所有行 status等于1的行,请使用;

status

这为您提供与当前查询完全相同的结果,WHERE tbl2.status <> 1 无关紧要。

答案 3 :(得分:1)

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很棘手。当一个意想不到的结果让我感到困惑时,我常常让truth tables靠近我。

答案 4 :(得分:0)

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

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