У меня есть следующая таблица:
+--------+-----------+--------+
| ID | Title | Stat |
+--------+-----------+--------+
| 1 | title a | 1 |
+--------+-----------+--------+
| 1 | title b | 0 |
+--------+-----------+--------+
| 2 | title c | 1 |
+--------+-----------+--------+
| 2 | title d | 1 |
+--------+-----------+--------+
| 3 | title e | 0 |
+--------+-----------+--------+
| 3 | title f | 1 |
+--------+-----------+--------+
| 3 | title g | 1 |
+--------+-----------+--------+
Мне нужно построить запрос, в результате которого будут включены только те записи, где ВСЕ значения в столбце Stat удовлетворяют определенному условию.
В приведенной выше таблице, как сформулировать запрос, который в основном означал бы: показать мне записи только для тех идентификаторов, которые имеют все значения в столбце Stat = 1, и в результате получится следующая таблица?
+--------+-----------+--------+
| 2 | title c | 1 |
+--------+-----------+--------+
| 2 | title d | 1 |
+--------+-----------+--------+
Спасибо.
Что-то вроде этого?
SELECT
*
FROM table t
LEFT JOIN (
SELECT
MIN(Stat) AS Stat,
ID
FROM table
GROUP BY ID
) minstat ON t.ID = minstat.ID
WHERE minstat.Stat = 1;
В принципе, подзапрос вычисляет минимальный стат для каждого идентификатора, тогда как внешний запрос выбирает строки с минимальным статом, равным 1. Если все строки должны удовлетворять определенному условию, вставьте логическое выражение вместо Stat в минимум.
Не уверен, что это возможно без подзапроса.
Все 3 предложенных решения выше работают хорошо, разница только в скорости выполнения. На таблице, где найдено 3 записи, примерно из 7000 результатов:
Martijn's: Отображение строк 0 - 2 (3 всего, запросов заняло 0,0069 сек)
Alex's: Показывать строки 0 - 2 (всего 3 запросов, запросов 0.1162 сек)
Pavelasc's: Отображение строк 0 - 2 (всего 3, запрос занял 0.6160 секунд)
Как насчет этого:
select * from t where not (id in (select id from t where stat=0));
Это также работает,
SELECT * FROM tablename t1
WHERE (
SELECT COUNT(*) FROM tablename t2
WHERE t1.ID = t2.ID AND t2.STAT = 0
) = 0
этот запрос проверяет, где STAT со значением 0 в записях с одинаковым идентификатором.