Всем привет! Не могу понять как сделать запрос. Есть таблица A и Б.
А таблица row_id,name.
Таблица Б:
row_id,table_a_id,status_id
Как понятно у таблиц связь многие к одному. Собственно споткнулся я на том что мне надо выбрать все записи из таблицы А у которых status_id = 1 и status_id = 2.
Если я делаю обычный join мне выводит все записи где есть статус 2 или статус 1, но ни как где одновременное оба статуса.
SELECT A.row_id, A.name FROM A
INNER JOIN B ON (B.table_a_id = A.row_id)
WHERE B.status_id = 1 OR B.status_id = 2
GROUP BY A.row_id, A.name
HAVING SUM(1) = 2
@morozovdenis и планировщик разве не должен ругнуться на использование результата выборки в HAVING?
Не проще ли убрать SUM(A.row_id) из SELECT и в HAVING написать SUM(1)=2?
@morozovdenis забавно будет, если A.row_id является полем с целочисленным инкрементируемым типом данных. В таком случае SUM(A.row_id) никогда не будет равен двум)))
@morozovdenis не знаю как в MySQL, но, например, в PG SUM(1) для таких целей использовать предпочтительнее, чем COUNT(*). Да и вообще, использовать COUNT(*) - плохая практика, должно быть хотя бы COUNT(id)...
@morozovdenis как минимум потому, что COUNT(id) быстрее, чем COUNT(*).
А вообще COUNT(*) немного отличается по функциональности от COUNT(id), но в контексте решения этой задачи нет особой разницы что использовать. Но т.н. для COUNT(*) есть более быстрый аналог COUNT(1).
От медленным к быстрым: COUNT(*), COUNT(id), COUNT(1).
Если интересуют подробности, то гугл в помощь :) ну или ставьте свои эксперименты :)
Давно не работал с MySQL, но вот как мне видится решение:
SELECT a.row_id, a.name
FROM a JOIN b ON b.table_a_id=a.id
WHERE a.id IN (
SELECT a.id FROM a JOIN b ON b.table_a_id=a.id AND b.status_id=1
INTERSECT
SELECT a.id FROM a JOIN b ON b.table_a_id=a.id AND b.status_id=2
)