MySQL UNION SELECT 和 IN 子句

szp*_*pal 3 mysql union select

我有两个非常简单的表:t1t2包含以下行:

桌子t1

id, name
1   PBN
Run Code Online (Sandbox Code Playgroud)

桌子t2

id, name
100 FIBERHOME
Run Code Online (Sandbox Code Playgroud)

查询1:

SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (1)
Run Code Online (Sandbox Code Playgroud)

结果是:PBN

查询2:

SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)
Run Code Online (Sandbox Code Playgroud)

结果是:PBN、FIBERHOME

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

Adr*_*nch 5

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

\n\n
SELECT name FROM (\n    SELECT id, name FROM t1\n    UNION\n    SELECT id, name FROM t2\n) unioned\nWHERE id IN (1,100)\n
Run Code Online (Sandbox Code Playgroud)\n\n

速度可能不太快,所以最好进行测试。

\n\n

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

\n\n
\n

我认为 WHERE 子句是全局 \xe2\x80\x93 @szpal

\n
\n\n

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

\n\n

他们自己:

\n\n
SELECT id, name FROM x WHERE colA = 123\n
Run Code Online (Sandbox Code Playgroud)\n\n

和:

\n\n
SELECT id, name FROM y WHERE colB = 456\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后与(错误的)单个 WHERE 子句一起:

\n\n
SELECT id, name FROM x\nUNION\nSELECT id, name FROM y\nWHERE colB = 456 -- But table x doesn't have a colB!\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
SELECT id, name FROM x\nWHERE colA = 123 -- I have a colA, still don't have a colB\nUNION\nSELECT id, name FROM y\nWHERE colB = 456 -- I have a colB, still don't have a colA\n
Run Code Online (Sandbox Code Playgroud)\n\n

每个人都是赢家!

\n