【问题标题】:UNION query not returning extra columnUNION 查询不返回额外的列
【发布时间】:2017-11-29 09:41:57
【问题描述】:

我有两个要合并的 SQL 查询,很遗憾我不是 MYSQL 知识渊博的用户。

现在这是我的查询:

SELECT animal.species, count(animal.species) as f
FROM disp, animaldesc, animal 
WHERE disp.disp_id = animaldesc.disp_id 
AND animaldesc.authored = 1 
AND animaldesc.animal_id = animal.id 
GROUP BY animal.species 
union
SELECT animal.species, count(animal.species) as f_specific
FROM disp, animaldesc, animal 
WHERE disp.disp_id = animaldesc.disp_id 
AND animaldesc.authored = 1 
AND animaldesc.animal_id = animal.id 
AND disp.language = "en_gb" 
GROUP BY animal.species 
ORDER BY f DESC

此查询返回如下数据:

-----------------------|--------------------
species                | f
-----------------------|--------------------
M_A_1789               | 5
-----------------------|--------------------
M_A_1789               | 1
-----------------------|--------------------
M_A_1731               | 5
-----------------------|--------------------
M_A_1731               | 1

虽然我得到了我想要的所有数据,但结构是错误的。我相信这与使用 UNION 而不是 JOIN 有关。但是,我不确定要使用哪种类型的 JOIN(我猜是右外),因为 f_specific 可以返回比 f 更少的行。

除了使用 UNION 方法之外,我找不到明确的解释来组合这两个查询?如何使用 JOIN 关键字,以便我的查询返回:

-----------------------|------------|---------------
species                | f          | f_specific
-----------------------|------------|---------------
M_A_1789               | 5          |     1
-----------------------|------------|---------------
M_A_1731               | 5          |     1
-----------------------|------------|---------------

最好的问候。

【问题讨论】:

    标签: mysql join union


    【解决方案1】:

    您需要的查询是:

    SELECT animal.species, 
        COUNT(animal.species) AS f, 
        SUM(IF(disp.language = "en_gb", 1, 0)) AS f_specific
    FROM disp, animaldesc, animal 
    WHERE disp.disp_id = animaldesc.disp_id 
        AND animaldesc.authored = 1 
        AND animaldesc.animal_id = animal.id 
    GROUP BY animal.species 
    

    这是来自您的UNION 的第一个查询,它针对具有disp.language = 'en_gb' 的每一行另外将1 添加到f_specific。它应该返回您期望的结果集。

    【讨论】:

    • 将IF(disp.language = "en_gb"), 1, 0 替换为IF(disp.language = "en_gb", 1, 0)。
    • 是的,这个查询有效。 IF 语句有问题,我将其替换为 `SUM(case when disp.language = "en_gb" then 1 else 0 end) AS f_specific` 谢谢!
    • 哦,IF 的右括号放错了位置。我现在修好了。
    猜你喜欢
    • 2017-08-09
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    相关资源
    最近更新 更多