MySQL UNION SELECT 和 IN 子句
MySQL UNION SELECT and IN clause
我有两个非常简单的 table:t1
和 t2
,其中包含以下行:
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)
但这可能会降低性能。
我有两个非常简单的 table:t1
和 t2
,其中包含以下行:
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)
但这可能会降低性能。