Как уже говорили другие, вы должны агрегировать данные, но есть много потенциальных проблем с этим. Но прежде чем мы перейдем к этому, вы заявили, что хотите получить исходные записи в выходных данных, а не консолидированные данные, и самое простое решение - использовать 2 запроса - один для идентификации foreign_ids только с status = 0 и один для получения соответствующего строки
SELECT r.*
FROM examples r
JOIN ( SELECT s.foreign_id, MAX(s.status)
FROM examples s
GROUP BY s.foreign_id
HAVING MAX(s.status)=0
) t
ON r.foreign_id=t.foreign_id
В качестве альтернативы вы можете получить foreign_ids, где status! = 0, и исключить их во втором запросе, что может быть более эффективным в зависимости от распределения ваших данных.
Если это не так, то в случае, когда «status» <0. Вывод будет включать эти строки (потенциально то же самое может произойти с SUM ()). Есть несколько способов решения этой проблемы, например, SUM (ABS (статус)) или SUM (IF (статус = 0,0,1)). Как предполагает Мадхур, вы также можете использовать GROUP_CONCAT (статус) и проверять, что выходной столбец только «0». </p>
Но я подозреваю, что вы собираетесь сказать мне, что статус не может быть отрицательным (или нулевым?), Поскольку это номинальное число . Если это так, то вы используете неправильный тип данных - вы должны использовать ENUM. Если это так, то вы не можете применить SUM () или MAX () к ENUM, но вы все равно можете использовать методы SUM (IF (status = ?, 0,1)) или GROUP_CONCAT ().
Следовательно ....
SELECT r.*
FROM examples r
JOIN ( SELECT s.foreign_id, SUM(IF(status=0,0,1))
FROM examples s
GROUP BY s.foreign_id
HAVING SUM(IF(status=0,0,1))=0
) t
ON r.foreign_id=t.foreign_id