Запрос UNION не возвращает дополнительный столбец

У меня есть два 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
-----------------------|------------|---------------

С наилучшими пожеланиями.


person Clueless_captain    schedule 29.11.2017    source источник


Ответы (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, который дополнительно добавляет 1 к f_specific для каждой строки, содержащей disp.language = 'en_gb'. Он должен вернуть ожидаемый набор результатов.

person axiac    schedule 29.11.2017
comment
Замените IF(disp.language = "en_gb"), 1, 0 на IF(disp.language = "en_gb", 1, 0). - person Sergey Menshov; 29.11.2017
comment
Да, этот запрос работал. Была проблема с оператором IF, я заменил его на ` SUM (случай, когда disp.language = en_gb, затем 1, иначе 0 конец) AS f_specific` Спасибо! - person Clueless_captain; 29.11.2017
comment
О, закрывающая скобка IF была неуместна. Я исправил это сейчас. - person axiac; 29.11.2017