MySQL UNION SELECT和IN子句

时间:2016-02-25 10:25:07

标签: mysql select union

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

t1

id, name
1   PBN

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 ..!是什么原因?

3 个答案:

答案 0 :(得分:2)

UNION总结了两个结果。 在第一个查询中,没有条件因此它返回 PBN ,然后它会添加第二个结果的结果 FIBERHOME
使用UNION你可以尝试:

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

答案 1 :(得分:2)

要扩展@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中使用的子查询中。

  

我认为WHERE子句是全局的 - @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

每个人都是胜利者!

答案 2 :(得分:0)

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

SELECT name FROM t1

将返回

id  name
1   PBN

SELECT name FROM t2 WHERE id IN (100)

将返回

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)

但这可能会降低性能。