Помогите с запросом MySQL выбрать только записи с определенным значением в столбце

0

У меня есть следующая таблица:

+--------+-----------+--------+
|   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   |
+--------+-----------+--------+

Спасибо.

  • 3
    Хм ... столбец уникального идентификатора. Я волнуюсь.
  • 0
    @middaparka: Никто не говорил, что ID является первичным ключом здесь; возможно это внешний ключ. Сказав это, мне также любопытно, как можно получить неуникальный столбец с именем ID (при условии, что он удачно назван). @ Алес: вы можете получить лучший ответ, если расскажете нам больше о схеме приложения / базы данных.
Показать ещё 1 комментарий
Теги:

4 ответа

2
Лучший ответ

Что-то вроде этого?

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 в минимум.

Не уверен, что это возможно без подзапроса.

  • 0
    Спасибо человек, пытался понять это часами :)
  • 0
    Добро пожаловать. Тем не менее, любопытно, может быть, вы можете улучшить схему базы данных, чтобы избежать такого рода странных запросов
0

Все 3 предложенных решения выше работают хорошо, разница только в скорости выполнения. На таблице, где найдено 3 записи, примерно из 7000 результатов:

Martijn's: Отображение строк 0 - 2 (3 всего, запросов заняло 0,0069 сек)

Alex's: Показывать строки 0 - 2 (всего 3 запросов, запросов 0.1162 сек)

Pavelasc's: Отображение строк 0 - 2 (всего 3, запрос занял 0.6160 секунд)

0

Как насчет этого:

select * from t where not (id in (select id from t where stat=0));
  • 0
    Алес утверждает, что мое решение самое медленное. Но, на мой взгляд, это самое быстрое в человеческом понимании и времени воспроизведения. А поскольку Алес "... пытался выяснить это часами ...", это вполне может быть решающим фактором.
0

Это также работает,

SELECT * FROM tablename t1  
WHERE (
        SELECT COUNT(*) FROM tablename t2 
        WHERE t1.ID = t2.ID AND t2.STAT = 0
      ) = 0

этот запрос проверяет, где STAT со значением 0 в записях с одинаковым идентификатором.

  • 0
    Да, этот работает также хорошо, только когда у вас много записей, решение Martijn кажется намного быстрее. Спасибо, в любом случае.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню