2017-11-29 16 views
0

私はマージしたいSQLクエリを2つ持っていますが、残念ながらMYSQLの知識のあるユーザーではありません。今、このためにUNIONクエリで余分な列が返されない

は私のクエリです:

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 

Allthough、構造が間違っています。私はJOINをする代わりにUNIONを使うことと関係していると思います。私はしかし、使用するJOINのタイプ(私は右外側を推測している)について確信しています。なぜなら、f_specificはfよりも少ない行を返すことができるからです。

UNIONメソッド以外の2つのクエリを組み合わせる明確な説明が見つかりませんでしたか? JOINキーワードを使用すると、クエリは次のように返されます。

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

お勧めします。

答えて

3

SELECT species,SUM(f) AS f,SUM(f_specific) AS f_specific 
FROM 
    (
    SELECT animal.species, count(animal.species) AS f, NULL 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 ALL 

    SELECT animal.species, NULL AS f, 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 
) AS q 
GROUP BY species 
ORDER BY f DESC 

それともあなたが(サブクエリ内GROUP BYなし)以下のバリアントを使用することができると思う。この文字列で検索してください:

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'を持つ行ごとに〜f_specific期待した結果セットを返します。

+1

IF(disp.language = "en_gb"、1,0)にIF(disp.language = "en_gb")、1、0を置き換えます。 – Leran2002

+0

はい、このクエリが機能しました。 IF文に問題がありましたが、それを 'SUM 'に置き換えました(disp.language =" en_gb "、次に1 else 0 end)AS f_specific'ありがとう! –

+0

ああ、「IF」の閉じ括弧が間違っていました。私は今それを修正した。 – axiac

0

あなたが必要とするクエリがある

SELECT species,SUM(f) AS f,SUM(f_specific) AS f_specific 
FROM 
    (
    SELECT animal.species, 1 AS f, 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 

    UNION ALL 

    SELECT animal.species, 0 AS f, 1 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" 
) AS q 
GROUP BY species 
ORDER BY f DESC 
関連する問題