Как в таблице MYSQL выбрать только последние строки по заданным параметрам?

345
04 февраля 2018, 02:12

Подсобите новичку. Ситуация очень похожая на ту, которая в этом вопросе. Только статусы у меня могут принимать 3 значения (1, 2 и 3).

Запрос выглядит так:

SELECT * FROM wp_lessons_uls_welcomecourse_access 
WHERE wp_lessons_uls_welcomecourse_access.status IN (1,2,3) 
group by userId, lessonNum
having max(status) IN (1,2) and min(status)=1

Задача: нужно выбрать id только тех строк, где у userId и lessonNum последний добавленный статус (status) = 1.

Проблемы:

  • если у userId, lessonNum последняя строка имеет статус 2, то id этих строк тоже попадают в выборку. И это то, над чем уже вторые сутки бьюсь. Знаю, что попадает, потому что это прописано тут: having max(status) IN (1,2)

  • Если написать having max(status) = 1, то из выборки выпадают id строк, у которых статус принимал значение 2;

  • Если написать having max(status) = 2, то отображаются только те id, где статус принимал значение 2;

Перелопатил уже всё, что нашел по подходящим темам на этом сайте. Скорее всего, конечно, ищу неправильно, потому что толком не могу сформулировать, что мне надо найти.

Answer 1

Mike, благодарю за комментарий. Прям выручило! Полдня разбирался с теорией про группировки, алиасы и т.п., но в итоге всё зараболо!

Для тех, кто столкнётся с аналогичной проблемой - вот статья (Группировка в MySQL), где подробно разжёвано, что да как делать в подобной ситуации.

Решение получилось длинным, поэтому коротко суть:

  1. Собрал все id, у которых status = 1. Добавил их в массив 1;
  2. Собрал последние id для каждого userId. Добавил их в массив 2;
  3. Собрал в массив 3 все id, у которых статус может принимать значения 1 и 2 с условием, что они должны присутствовать в массивах 1 и 2;
  4. Сделал конечную выборку из массива 3 с тем условием, что статус обязательно должен быть равен 1;

Уверен, что можно сделать стройнее и изящнее. Но главное, что всё работает именно так, как задумано! Ещё раз благодарю за помощь!

READ ALSO
Не работает форма подписки, не приходят письма

Не работает форма подписки, не приходят письма

Здравствуйте, не работает форма именно на VPS, но если скопировать сайт целиком на хостинг то все прекрасно работает! Заранее спасибо!

280
SUM SQL запрос, как правильно?

SUM SQL запрос, как правильно?

ЗдравствуйтеПомогите пожалуйста правильно составить SQL запрос

287
Поиск по базе mysql на php

Поиск по базе mysql на php

Стоит задача сделать поиск в базе через php

255
zlib.output_compression Wordpress

zlib.output_compression Wordpress

В Вордпрессе всплывает такое предупреждение: Notice: ob_end_flush(): failed to send buffer of zlib output compression (1) Появилось оно после импорта всяких тестовых записей...

298