具有相同和不同列的两个mysql查询的并集结果

时间:2019-07-16 16:21:11

标签: mysql sql database

我有问题。有两个MySQL查询,也有相同的列和不同的列。我想合并两个查询的结果,我希望结果包含这两个查询的结果的每一列(但同一列仅显示一次)。

我试图解释:

查询1:

SELECT pcs_persons.id AS id_person, pcs_persons.firstname AS firstname, 

pcs_persons.lastname AS lastname, pcs_lineup.id_club, pcs_lineup.type, count(case 

when pcs_lineup.type = '2' then 1 else NULL end) AS starter, count(case when 

pcs_subs.id_person_in = pcs_lineup.id_person AND pcs_lineup.type = '3' then 1 else 

NULL end) AS subs
FROM pcs_lineup
JOIN pcs_persons ON pcs_lineup.id_person = pcs_persons.id AND pcs_lineup.id_club = 2
JOIN pcs_matchs ON pcs_lineup.id_match = pcs_matchs.id AND pcs_matchs.id_compet 

= 1 AND pcs_matchs.id_season = 1
LEFT JOIN pcs_subs ON pcs_lineup.id_person = pcs_subs.id_person_in
GROUP BY id_person

查询1的结果

+-------------+------------+---------------+----------+-------+----------+------+
|  id_person  | firstname  |   lastname    | id_club  | type  | starter  | subs |
+-------------+------------+---------------+----------+-------+----------+------+
|        194  | Jesper     | Hansen        |       2  |    2  |       1  |    0 |
|        195  | Mikkel     | Andersen      |       2  |    3  |       0  |    0 |
|        197  | Alexander  | Scholz        |       2  |    2  |       1  |    0 |
|        198  | Erik       | Sviatchenko   |       2  |    2  |       2  |    0 |
|        199  | Kian       | Hansen        |       2  |    2  |       1  |    1 |
|        204  | Manjrekar  | James         |       2  |    3  |       0  |    0 |
|        207  |            | Paulinho      |       2  |    2  |       1  |    0 |
|        209  | Joel       | Andersson     |       2  |    2  |       2  |    0 |
|        214  | Jens       | Cajuste       |       2  |    3  |       0  |    0 |
|        215  |            | Evander       |       2  |    2  |       1  |    0 |
|        216  | Jakob      | Poulsen       |       2  |    3  |       0  |    0 |
|        217  | Ayo        | Simon Okosun  |       2  |    2  |       1  |    0 |
|        225  | Gustav     | Wikheim       |       2  |    2  |       1  |    0 |
|        226  | Mikael     | Anderson      |       2  |    3  |       0  |    1 |
|        229  | Awer       | Mabil         |       2  |    3  |       0  |    1 |
|        230  | Frank      | Onyeka        |       2  |    2  |       1  |    0 |
|        234  | Artem      | Dovbyk        |       2  |    3  |       0  |    1 |
|        235  | Júnior     | Brumado       |       2  |    2  |       1  |    1 |
+-------------+------------+---------------+----------+-------+----------+------+

查询2:

SELECT pcs_persons.id AS id_person, pcs_persons.firstname AS firstname, 

pcs_persons.lastname AS lastname, pcs_lineup.id_club, pcs_lineup.type, count(case 

when pcs_goals.id_match = pcs_matchs.id AND pcs_goals.id_person = 

pcs_lineup.id_person then 1 else NULL end) AS goal
FROM pcs_lineup
JOIN pcs_persons ON pcs_lineup.id_person = pcs_persons.id AND pcs_lineup.id_club = 2
JOIN pcs_matchs ON pcs_lineup.id_match = pcs_matchs.id AND pcs_matchs.id_compet 

= 1 AND pcs_matchs.id_season = 1
LEFT JOIN pcs_goals ON pcs_lineup.id_person = pcs_goals.id_person AND 

pcs_goals.goal_csc = 0
GROUP BY id_person

查询2的结果

+-------------+------------+---------------+----------+-------+------+
|  id_person  | firstname  |   lastname    | id_club  | type  | goal |
+-------------+------------+---------------+----------+-------+------+
|        194  | Jesper     | Hansen        |       2  |    2  |    0 |
|        195  | Mikkel     | Andersen      |       2  |    3  |    0 |
|        197  | Alexander  | Scholz        |       2  |    2  |    0 |
|        198  | Erik       | Sviatchenko   |       2  |    2  |    1 |
|        199  | Kian       | Hansen        |       2  |    2  |    0 |
|        204  | Manjrekar  | James         |       2  |    3  |    0 |
|        207  |            | Paulinho      |       2  |    2  |    0 |
|        209  | Joel       | Andersson     |       2  |    2  |    2 |
|        214  | Jens       | Cajuste       |       2  |    3  |    0 |
|        215  |            | Evander       |       2  |    2  |    0 |
|        216  | Jakob      | Poulsen       |       2  |    3  |    0 |
|        217  | Ayo        | Simon Okosun  |       2  |    2  |    0 |
|        225  | Gustav     | Wikheim       |       2  |    2  |    0 |
|        226  | Mikael     | Anderson      |       2  |    3  |    0 |
|        229  | Awer       | Mabil         |       2  |    3  |    0 |
|        230  | Frank      | Onyeka        |       2  |    2  |    0 |
|        234  | Artem      | Dovbyk        |       2  |    3  |    0 |
|        235  | Júnior     | Brumado       |       2  |    2  |    0 |
+-------------+------------+---------------+----------+-------+------+

我想合并这两个表(我尝试了UNION和UNION ALL,但没有成功)。所需的结果如下:

+-------------+------------+---------------+----------+-------+----------+------+-------+
|  id_person  | firstname  |   lastname    | id_club  | type  | starter  | subs |  goal |
+-------------+------------+---------------+----------+-------+----------+------+-------+
|        194  | Jesper     | Hansen        |       2  |    2  |       1  |    0 |     0 |
|        195  | Mikkel     | Andersen      |       2  |    3  |       0  |    0 |     0 |
|        197  | Alexander  | Scholz        |       2  |    2  |       1  |    0 |     0 |
|        198  | Erik       | Sviatchenko   |       2  |    2  |       2  |    0 |     1 |
|        199  | Kian       | Hansen        |       2  |    2  |       1  |    1 |     0 |
|        204  | Manjrekar  | James         |       2  |    3  |       0  |    0 |     0 |
|        207  |            | Paulinho      |       2  |    2  |       1  |    0 |     0 |
|        209  | Joel       | Andersson     |       2  |    2  |       2  |    0 |     2 |
|        214  | Jens       | Cajuste       |       2  |    3  |       0  |    0 |     0 |
|        215  |            | Evander       |       2  |    2  |       1  |    0 |     0 |
|        216  | Jakob      | Poulsen       |       2  |    3  |       0  |    0 |     0 |
|        217  | Ayo        | Simon Okosun  |       2  |    2  |       1  |    0 |     0 |
|        225  | Gustav     | Wikheim       |       2  |    2  |       1  |    0 |     0 |
|        226  | Mikael     | Anderson      |       2  |    3  |       0  |    1 |     0 |
|        229  | Awer       | Mabil         |       2  |    3  |       0  |    1 |     0 |
|        230  | Frank      | Onyeka        |       2  |    2  |       1  |    0 |     0 |
|        234  | Artem      | Dovbyk        |       2  |    3  |       0  |    1 |     0 |
|        235  | Júnior     | Brumado       |       2  |    2  |       1  |    1 |     0 |
+-------------+------------+---------------+----------+-------+----------+------+-------+

我希望一些专家可以为我提供帮助,因为我不知道该怎么做。非常感谢!

1 个答案:

答案 0 :(得分:0)

基于您的两个查询,您执行GROUP BY意味着您要标记每个查询本身就是可靠的结果(每个查询)。 这意味着UNION不是解决方案。

我能想到的最接近的解决方案是将两个查询都包含为源(临时集)

示例:

SELECT ........
FROM (  query1 )  as q1
JOIN  (  query2 ) as q2   ON q2.id_person = q1.id_person