Я видел много подобных вопросов, заданных:
Самый звездный из них: Получение последней записи в каждой группе — 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 отсутствует в результатах.
вы можете использовать внутреннее соединение
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
покажите мне точный результат, который вы получили .. max(id) ..потому что . группа по option_id должна возвращать значение для каждого option_id ... в конечном итоге лучше проверить содержимое вашей таблицы
Идентификатор пользователя — INT.
затем проверьте реальное содержание ваших тестовых данных для идентификатора и идентификатора опции.
Трижды проверил содержимое моей таблицы, и в запросе отсутствует какой-то option_id... sqlfiddle отключен, иначе я бы экспортировал таблицу, чтобы вы могли ее увидеть. :(
в любом случае это странно, когда вы можете создать действительный sqlfiddle . прокомментируйте мне ссылку, чтобы я мог проверить ту же ситуацию, что и ваша
Оказывается, это было так просто:
SELECT * FROM dbName.options where user_id =2
group by option_id
order by id desc;
Привет, кажется, это дает только частичные результаты - точно так же, как запрос, который я использовал в своем вопросе.