Как выбрать последнюю группу mysql, где указано другое ограничение?

Я видел много подобных вопросов, заданных:

Самый звездный из них: Получение последней записи в каждой группе — MySQL

Но мой вопрос в другом.

Я хотел бы выбрать последнюю группу (каждый option_id) для 1 пользователя. Не все последние и не все последние для всех пользователей.

Представьте себе таблицу под названием «опции»:

+-----+-----------+---------+-------+
| id  | option_id | user_id | value |
+-----+-----------+---------+-------+
| 100 |         3 |       2 |  1000 |
|  99 |         3 |       2 |   500 |
|  98 |         3 |       2 |  1000 |
|  97 |         2 |       2 |     2 |
|  96 |         2 |       2 |     6 |
|  95 |         1 |       2 |    88 |
|  94 |         1 |       2 |    87 |
|  93 |         3 |       2 |  1000 |
|  92 |         2 |       1 |    85 |
+-----+-----------+---------+-------+

Ожидаемый результат запроса для user_id=2:

+-----+-----------+---------+-------+
| id  | option_id | user_id | value |
+-----+-----------+---------+-------+
| 100 |         3 |       2 |  1000 |
|  97 |         2 |       2 |     2 |
|  95 |         1 |       2 |    88 |
+-----+-----------+---------+-------+

Псевдозапрос: select latest (highest id) of each option_id where user_id=2

Вот что я пробовал:

SELECT * 
FROM options 
where user_id =2 and id IN (
    select max(id)
    from options
    group by option_id
)

Вроде как дает ожидаемые результаты, но только для некоторых option_id не для всех. Поэтому я бы получил строки 100 и 95 только для user_id=2, но option_id 2 отсутствует в результатах.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
23
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы можете использовать внутреннее соединение

select * from  options o
inner join (
  select max(id) max_id, option_id 
  from options
  group by option_id 
) t on t.max_id = o.id and t.option_id = o.option_id
where  user_id= 2  

Привет, кажется, это дает только частичные результаты - точно так же, как запрос, который я использовал в своем вопросе.

Domatorov 10.04.2019 18:23

покажите мне точный результат, который вы получили .. max(id) ..потому что . группа по option_id должна возвращать значение для каждого option_id ... в конечном итоге лучше проверить содержимое вашей таблицы

ScaisEdge 10.04.2019 18:25

Идентификатор пользователя — INT.

Domatorov 10.04.2019 18:31

затем проверьте реальное содержание ваших тестовых данных для идентификатора и идентификатора опции.

ScaisEdge 10.04.2019 18:32

Трижды проверил содержимое моей таблицы, и в запросе отсутствует какой-то option_id... sqlfiddle отключен, иначе я бы экспортировал таблицу, чтобы вы могли ее увидеть. :(

Domatorov 10.04.2019 18:40

в любом случае это странно, когда вы можете создать действительный sqlfiddle . прокомментируйте мне ссылку, чтобы я мог проверить ту же ситуацию, что и ваша

ScaisEdge 10.04.2019 18:42
Ответ принят как подходящий

Оказывается, это было так просто:

SELECT * FROM dbName.options where user_id =2

group by option_id

order by id desc;

Другие вопросы по теме