MySQL UNION SELECT 和 IN 子句

MySQL UNION SELECT and IN clause

我有两个非常简单的 table:t1t2,其中包含以下行:

table t1:

id, name
1   PBN

table t2:

id, name
100 FIBERHOME

查询 1:

SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (1)

结果是:PBN

查询 2:

SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)

结果是:PBN、FIBERHOME

但预期的结果是:FIBERHOME..!这是什么原因?

UNION 将两个结果相加。 在第一个查询中,没有条件所以它 returns PBN,然后它添加第二个结果 FIBERHOME.
使用 UNION 你可以试试:

SELECT name FROM t1 WHERE id IN (100) UNION SELECT name FROM t2 WHERE id IN (100)

扩展@Knep 的答案,如果你只想要一个 WHERE id IN ():

SELECT name FROM (
    SELECT id, name FROM t1
    UNION
    SELECT id, name FROM t2
) unioned
WHERE id IN (1,100)

可能速度不是很好,所以最好测试一下。

另请注意 id 需要在子查询中才能在外部 WHERE 中使用。

I thought that the WHERE clause is global – @szpal

要回答为什么 WHERE 不用于 UNION 中的所有查询的问题,请考虑两个不共享列的查询。

靠自己:

SELECT id, name FROM x WHERE colA = 123

并且:

SELECT id, name FROM y WHERE colB = 456

然后连同(不正确的)单个 WHERE 子句:

SELECT id, name FROM x
UNION
SELECT id, name FROM y
WHERE colB = 456 -- But table x doesn't have a colB!

而如果(正确地)WHERE 子句位于每个查询中:

SELECT id, name FROM x
WHERE colA = 123 -- I have a colA, still don't have a colB
UNION
SELECT id, name FROM y
WHERE colB = 456 -- I have a colB, still don't have a colA

人人都是赢家!

第二个查询中的 where 条件将在 union 之前执行。

SELECT name FROM t1

将return

id  name
1   PBN

SELECT name FROM t2 WHERE id IN (100)

将return

id    name
null  null

并集会将以上两个结果合并为

SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)

id  name
1   PBN

你可以通过

解决这个问题
SELECT 
name
FROM
    (SELECT 
        *
    FROM
        interns_test_db.t1 UNION SELECT 
        *
    FROM
        interns_test_db.t2) A
WHERE
    ID IN (100)

但这可能会降低性能。