Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择带有where条件的union,而列具有不同的名称_Mysql_Union_Union All - Fatal编程技术网

Mysql 选择带有where条件的union,而列具有不同的名称

Mysql 选择带有where条件的union,而列具有不同的名称,mysql,union,union-all,Mysql,Union,Union All,情景: 表1: city_id | city_name | ... ------------------------------------- 1 | Aaaa 2 | Bbb 3 | Ccc 4 | Ddd ... 表2: region_id | region_name | ... -------------------------------------

情景:

表1:

city_id     |   city_name       | ...
-------------------------------------
1           |   Aaaa
2           |   Bbb
3           |   Ccc
4           |   Ddd
...
表2:

region_id   |   region_name     | ...
-------------------------------------
1001        |   Qwer
1002        |   Zxcv
1003        |   Vbnm
...
预期结果:

id          |   name     | ...
-------------------------------------
3           |   Ccc
4           |   Ddd
1001        |   Qwer
1002        |   Zxcv
1003        |   Vbnm
...
两个表中的ID保证是不同的

我想选择两个带有union的表(因为它们是一个表),然后使用
WHERE

查询1

SELECT
    city_id     AS 'id',
    city_name   AS 'name'
FROM table1
UNION
SELECT
    region_id   AS 'id',
    region_name AS 'name'
FROM table2
WHERE 'id' > 2
但是这个查询只返回第一个表中的数据

我刚刚看到实现这一点的一种方法是将工会包装成一个select

查询2

SELECT * FROM (
    SELECT
        city_id     AS 'id',
        city_name   AS 'name'
    FROM table1
    UNION
        region_id   AS 'id',
        region_name AS 'name'
    FROM table2
) AS t
WHERE t.id > 2
有没有不使用子查询的孤子

如果不是,在这种情况下(大约)使用子查询对性能有何影响

奖金问题

查询2中,为什么将
WHERE
应用于第一个表?不应该是这样的吗

{{
    SELECT
        city_id     AS 'id',
        city_name   AS 'name'
    FROM table1
}}
UNION
{{
    SELECT
        region_id   AS 'id',
        region_name AS 'name'
    FROM table2
    WHERE 'id' > 2
}}
更新 比较子查询和接受的答案

  • 0-1k行:子查询速度慢约20%
  • 1k-100k行:待办事项

您可以在两个查询中添加相同的WHERE子句:

SELECT
    city_id     AS 'id',
    city_name   AS 'name'
FROM table1
WHERE city_id > 2
UNION
    region_id   AS 'id',
    region_name AS 'name'
FROM table2
WHERE region_id > 2
;

至于与性能相关的问题,如果在计算UNION子查询之后计算WHERE子句,并且id列上有索引,那么您可能不会从索引中受益。但是,您必须检查执行计划,以查看优化器是否正确识别了此情况并按索引进行了操作。

您可以向两个查询添加相同的WHERE子句:

SELECT
    city_id     AS 'id',
    city_name   AS 'name'
FROM table1
WHERE city_id > 2
UNION
    region_id   AS 'id',
    region_name AS 'name'
FROM table2
WHERE region_id > 2
;

至于与性能相关的问题,如果在计算UNION子查询之后计算WHERE子句,并且id列上有索引,那么您可能不会从索引中受益。但您必须检查执行计划,以查看优化器是否正确识别此案例并按索引进行操作。

从表1中选择city\u id作为“id”,city\u name作为“name”,这就是为什么:
只返回表1中的id和城市名称:
“此查询只返回第一个表中的数据。”
编辑您的问题并向我们展示您期望的结果
从表1中选择city\u id作为“id”,city\u name作为“name”
从表1中只返回id和城市名称,这就是为什么:
“此查询只返回第一个表中的数据。”
编辑您的问题并向我们展示您期望的结果如此简单,我觉得很愚蠢。问:如果两个表都有相同的列名,我的查询1是否会像预期的那样工作,或者我是否仍然需要在两个查询中放置
WHERE
。问题:如果两个表都有相同的列名,我的查询1是否会像预期的那样工作,或者我是否仍然需要在两个查询中放置
WHERE