У меня есть таблица Mysql:
+--------+--------------+
| idform | user_id |
+--------+--------------+
| 17 | 2 |
| 16 | 2 |
| 15 | 2 |
| 14 | 2 |
| 13 | 18 |
| 12 | 18 |
| 11 | 18 |
| 10 | 18 |
| 9 | 18 |
| 8 | 1 |
| 6 | 2 |
| 5 | 2 |
| 3 | 2 |
| 1 | 2 |
+--------+--------------+
14 rows in set (0.00 sec)
Мне нужен запрос, который дает мне такой результат:
+----------------+--------------+
| idform | user_id |
+----------------+--------------+
| 17,16,15,14 | 2 |
| 13,12,11,10,9 | 18 |
| 8 | 1 |
| 6,5,3,1 | 2 |
+----------------+--------------+
4 rows in set (0.00 sec)
Я попытался использовать функцию GROUP_CONCAT() MYSQL, но я не мог заставить результат выглядеть так. Все, что я хочу сделать, - MYSQL возвращает результаты по порядку, но создает новую группу для нового пользователя. Создайте новую группу, добавьте идентификаторы с запятой, затем в новый user_id создайте новую группу.
Я знаю, что могу сделать это по программному пути с PHP, но если я сделаю это с PHP, у меня возникнут проблемы с разбивкой по страницам.
есть идеи как это сделать?
Благодарю вас.
EDIT: Я также попробовал запрос следующим образом: SELECT GROUP_CONCAT (idform) FROM story GROUP_BY user_id. Но он дает результат следующим образом:
+---------------------+--------------+
| idform | user_id |
+---------------------+--------------+
| 8 | 1 |
| 1,3,5,6,14,15,16,17 | 2 |
| 9,10,11,12,13 | 18 |
+---------------------+--------------+
3 rows in set (0.00 sec)
Вам нужно сравнить последовательный идентификатор пользователя и после сравнения назначить каждой группе номер. Позже вы можете использовать group_concat над данными с этим group_number
.
Я думаю, что ниже запрос должен работать для вас.
SELECT GROUP_CONCAT(idform)
FROM (
SELECT
story.*
, @groupNumber := IF(@prev_userID != user_id, @groupNumber + 1, @groupNumber) AS gn
, @prev_userID := user_id
FROM story
, (SELECT @groupNumber := 0, @prev_userID := NULL) subquery
) sq
GROUP BY gn;
SELECT group_concat(idform) FROM your_table group_by user_id