首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL联合SELECT和IN子句

MySQL联合SELECT和IN子句
EN

Stack Overflow用户
提问于 2016-02-25 10:25:07
回答 3查看 3K关注 0票数 3

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

t1

代码语言:javascript
运行
复制
id, name
1   PBN

t2

代码语言:javascript
运行
复制
id, name
100 FIBERHOME

查询1:

代码语言:javascript
运行
复制
SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (1)

结果是: PBN

查询2:

代码语言:javascript
运行
复制
SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)

结果是: PBN,FIBERHOME

但预期的结果是:纤维之家!原因何在?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-25 10:36:40

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

代码语言:javascript
运行
复制
SELECT name FROM (
    SELECT id, name FROM t1
    UNION
    SELECT id, name FROM t2
) unioned
WHERE id IN (1,100)

可能不是很好的速度,所以最好去测试。

注意,id需要位于要在外部WHERE中使用的子查询中。

我认为WHERE子句是全局的- @szpal

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

靠他们自己:

代码语言:javascript
运行
复制
SELECT id, name FROM x WHERE colA = 123

和:

代码语言:javascript
运行
复制
SELECT id, name FROM y WHERE colB = 456

然后加上(不正确的)单句WHERE子句:

代码语言:javascript
运行
复制
SELECT id, name FROM x
UNION
SELECT id, name FROM y
WHERE colB = 456 -- But table x doesn't have a colB!

然而,如果(正确) WHERE子句与每个查询放在一起:

代码语言:javascript
运行
复制
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

每个人都是赢家!

票数 4
EN

Stack Overflow用户

发布于 2016-02-25 10:31:36

联合总结了这两个结果。在第一个查询中,没有条件,因此它返回PBN,然后添加第二个结果FIBERHOME的结果。

使用UNION,您可以尝试:

代码语言:javascript
运行
复制
SELECT name FROM t1 WHERE id IN (100) UNION SELECT name FROM t2 WHERE id IN (100)
票数 2
EN

Stack Overflow用户

发布于 2016-02-25 10:39:00

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

代码语言:javascript
运行
复制
SELECT name FROM t1

会回来

代码语言:javascript
运行
复制
id  name
1   PBN

SELECT name FROM t2 WHERE id IN (100)

会回来

代码语言:javascript
运行
复制
id    name
null  null

工会将将上述两项结果合并为

代码语言:javascript
运行
复制
SELECT name FROM t1 UNION SELECT name FROM t2 WHERE id IN (100)

id  name
1   PBN

你可以通过

代码语言:javascript
运行
复制
SELECT 
name
FROM
    (SELECT 
        *
    FROM
        interns_test_db.t1 UNION SELECT 
        *
    FROM
        interns_test_db.t2) A
WHERE
    ID IN (100)

但这可能会降低性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35624578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档