Вот мой стол:
// notifications
+----+--------+-----------+---------+--------------------+
| id | money | post_id | user_id | belongs_to_user_id |
+----+--------+-----------+---------+--------------------+
| 1 | 5 | 1 | 123 | 101 |
| 2 | 10 | 2 | 123 | 101 |
| 3 | -2 | 4 | 456 | 101 |
| 5 | -2 | 2 | 456 | 101 |
| 6 | -2 | 3 | 123 | 101 |
| 7 | 5 | 4 | 789 | 101 |
| 8 | 10 | 4 | 789 | 101 |
+----+--------+-----------+---------+--------------------+
И я выбираю набор сгруппированных строк, используя этот запрос: (последние три группы) *
SELECT * FROM notifications
WHERE belongs_to_user_id = 101
GROUP BY post_id, user_id
ORDER BY id DESC
LIMIT 3
Вот текущий результат:
+----+--------+-----------+---------+--------------------+
| 5 | -2 | 2 | 456 | 101 |
| 6 | -2 | 3 | 123 | 101 |
| 7 | 5 | 4 | 789 | 101 | -- the eighth row is grouped with this
+----+--------+-----------+---------+--------------------+
Хотя ожидаемым результатом является набор извлеченных групп, таких как:
+----+--------+-----------+---------+--------------------+
| 5 | -2 | 2 | 456 | 101 |
| 6 | -2 | 3 | 123 | 101 |
| 7 | 5 | 4 | 789 | 101 |
| 8 | 10 | 4 | 789 | 101 |
+----+--------+-----------+---------+--------------------+
Как я могу это сделать?
Я считаю, вы хотите этого:
SELECT n.*
FROM notifications n JOIN
(SELECT n2.post_id, n2.user_id
FROM notifications n2
WHERE n2.belongs_to_user_id = 101
ORDER BY n2.id DESC
LIMIT 3
) nn
ON nn.post_id = n.post_id AND nn.user_id = n.user_id
ORDER BY id DESC;
В вашей проблеме нет предложения GROUP BY
. Вы, похоже, смущены терминологией SQL.
user_id
? Не правильно звучит.