powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Правильный последовательный выбор родителей и потомков из одной таблицы
19 сообщений из 19, страница 1 из 1
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304523
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с комментариями, допускающая 1 уровень вложенности. Комментарии подгружаются лимитированно, например нужно загрузить 5 штук. При чем не важно на каком они будут уровне, в сумме должно быть 5.

Все комментарии лежат в одной таблице. 0-й уровень parent = 0, 1-й уровень parent > 0

Логика: Выбираем 1 комментарий верхнего уровня, проверяем есть ли у него потомки, выбираем их, если не достигнут лимит, то выбираем второй комментарий верхнего уровня и т.д.

Получилось что-то такое неработающее:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT * FROM blogcomments JOIN
(
(SELECT id FROM blogcomments WHERE parent = 0) as parents
UNION ALL
SELECT id FROM blogcomments WHERE parent IN (SELECT parents FROM parents)
) as t ON t.id = blogcomments.id ORDER BY created ASC LIMIT 0,5
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304529
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT * 
FROM blogcomments
ORDER BY CASE parent WHEN 0 THEN id ELSE parent END, parent, id
LIMIT 5


?
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304559
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо за вариант, я не особенно знаток SQL, даже не знал этого, но в данном случае выбираются только parent = 0, а нужно что бы была такая последовательность:

id parent
1 0 //0-й уровень
321 1 //1-й уровень, потомок
322 1 //1-й уровень, потомок
2 0 //0-й уровень
23 2 //1-й уровень, потомок
26 2 //1-й уровень, потомок
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304683
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notconnectedв данном случае выбираются только parent = 0Вынь руки наружу и сделай нормально.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
mysql> CREATE TABLE blogcomments (
    -> id INT,
    -> parent INT,
    -> txt VARCHAR(32)
    -> );
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO blogcomments (id, parent, txt)
    -> SELECT 1,0,'1' UNION ALL
    -> SELECT 2,0,'2' UNION ALL
    -> SELECT 23,2,'-23' UNION ALL
    -> SELECT 26,2,'-26' UNION ALL
    -> SELECT 321,1,'-321' UNION ALL
    -> SELECT 322,1,'-322'
    -> ;
Query OK, 6 rows affected (0.02 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM blogcomments;
+------+--------+------+
| id   | parent | txt  |
+------+--------+------+
|    1 |      0 | 1    |
|    2 |      0 | 2    |
|   23 |      2 | -23  |
|   26 |      2 | -26  |
|  321 |      1 | -321 |
|  322 |      1 | -322 |
+------+--------+------+
6 rows in set (0.00 sec)

mysql> SELECT *
    -> FROM blogcomments
    -> ORDER BY CASE parent WHEN 0 THEN id ELSE parent END, parent, id;
+------+--------+------+
| id   | parent | txt  |
+------+--------+------+
|    1 |      0 | 1    |
|  321 |      1 | -321 |
|  322 |      1 | -322 |
|    2 |      0 | 2    |
|   23 |      2 | -23  |
|   26 |      2 | -26  |
+------+--------+------+
6 rows in set (0.01 sec)

mysql>
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304716
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Ой! Пардон, не обратил внимание на данные в базе, старые комменты были только верхнего уровня вложенности. Да работает как надо.

Но еще надо поправить сортировку. Верхний цровень должен сортироваться по дате создания 'created' DESC, а второй уровень локально по этому же полю. Никак не пойму как реализовать, нужно в результате запроса получить уже готовое дерево комментариев от новых к старым, но ответы на комментарии (второй уровень) должны сортироваться не в общем потоке, а локально в своей группе одного родителя.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304745
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notconnectedнадо поправить сортировку. Верхний цровень должен сортироваться по дате создания 'created' DESC, а второй уровень локально по этому же полю. Никак не пойму как реализоватьА вот тут уже нужны две копии. После связывания аналогично добавить CASE-вычисляемое поле сортировки, содержащее created родителя или (если сам родитель) свой. Причём самым первым.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39304980
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinanotconnectedнадо поправить сортировку. Верхний цровень должен сортироваться по дате создания 'created' DESC, а второй уровень локально по этому же полю. Никак не пойму как реализоватьА вот тут уже нужны две копии. После связывания аналогично добавить CASE-вычисляемое поле сортировки, содержащее created родителя или (если сам родитель) свой. Причём самым первым.
Что-то вроде этого:

Код: sql
1.
2.
3.
4.
(SELECT id FROM blogcomments WHERE parent = 0)  as parents
UNION
(SELECT id FROM blogcomments WHERE parent IN (SELECT id FROM parents)) as childs
ORDER BY CASE parent WHEN 0 THEN parents.created ELSE childs.created END DESC



?
Но та не работает, что-то с алиасами перемудрил :(
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305031
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notconnectedЧто-то вроде этогоБлизко не лежало...
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305327
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

не пойму о каком связывании речь?
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305346
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тест-скрипты в студию.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305349
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

ээээм, а можно для совсем одаренных как-то раскрыть это понятие? :)
Я через phpmyadmin все делаю, а запрос будет в php использоваться.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305380
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notconnectedможно для совсем одаренных как-то раскрыть это понятие?Два запроса. CREATE TABLE и INSERT INTO. Чтобы можно было создать точную копию твоей таблицы и с твоими данными. Ну и, само собой, желаемый результат, причём именно на этих данных.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305408
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE TABLE `blogcomments` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` int(11) unsigned DEFAULT
  `comment` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT
  `user_id` int(11) unsigned DEFAULT
  `created` datetime DEFAULT
  `parent` int(11) unsigned DEFAULT
  PRIMARY KEY (`id`)
);

INSERT INTO `blogcomments` (`id`, `post_id`, `comment`, `user_id`, `created`, `parent`) VALUES
(143, 169, 'wwwewe we we ????', 8, '2016-09-01 19:33:27', 0),
(144, 169, 'wewewe', 8, '2016-09-01 19:33:30', 0),
(145, 58, 'page', 'ergerg er ger', 8, '2016-09-01 19:37:10', 0),
(169, 169, '32334234234 333', 8, '2016-09-05 21:51:55', 143),
(170, 169, 'dddd', 8, '2016-09-05 21:54:08', 143),
(171, 169, 'rrrrrr', 8, '2016-09-05 21:54:51', 143),
(172, 169, 'rrrrr', 8, '2016-09-05 21:56:49', 143),
(173, 169, 'rrrrr', 8, '2016-09-05 21:57:06', 143),
(174, 169, 'rrrrr', 8, '2016-09-05 21:57:13', 143),
(175, 169, 'xxxxx', 8, '2016-09-05 22:00:10', 143),
(176, 169, 'xxxxx', 8, '2016-09-05 22:00:19', 143),
(177, 169, 'zzzsss', 8, '2016-09-05 22:00:34', 143),
(178, 169, 'sssssss', 8, '2016-09-05 22:04:02', 143),
(179, 169, 'zzzzzz', 8, '2016-09-05 22:04:10', 0),
(180, 169, 'ssss', 8, '2016-09-05 22:05:57', 144),
(181, 169, 'fffff', 8, '2016-09-05 22:06:01', 144),
(182, 169, 'ffffde333', 8, '2016-09-05 22:06:09', 0),
(183, 169, '554454', 8, '2016-09-05 22:06:20', 0),
(184, 169, 'dddddd', 8, '2016-09-05 22:10:04', 183),
(185, 169, '22222', 8, '2016-09-05 22:12:15', 183),
(186, 169, 'ddddd', 8, '2016-09-05 22:12:35', 183)



Результат получается должен вывести все комментарии до лимита в таком порядке (на основе запроса):

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
(183, 169, '554454', 8, '2016-09-05 22:06:20', 0),
(186, 169, 'ddddd', 8, '2016-09-05 22:12:35', 183),
(185, 169, '22222', 8, '2016-09-05 22:12:15', 183),
(184, 169, 'dddddd', 8, '2016-09-05 22:10:04', 183),
(182, 169, 'ffffde333', 8, '2016-09-05 22:06:09', 0),
(179, 169, 'zzzzzz', 8, '2016-09-05 22:04:10', 0),
(144, 169, 'wewewe', 8, '2016-09-01 19:33:30', 0),
(181, 169, 'fffff', 8, '2016-09-05 22:06:01', 144),
(180, 169, 'ssss', 8, '2016-09-05 22:05:57', 144),
(143, 169, 'wwwewe we we ????', 8, '2016-09-01 19:33:27', 0),
(170, 169, 'dddd', 8, '2016-09-05 21:54:08', 143),
(171, 169, 'rrrrrr', 8, '2016-09-05 21:54:51', 143),
(172, 169, 'rrrrr', 8, '2016-09-05 21:56:49', 143),
(173, 169, 'rrrrr', 8, '2016-09-05 21:57:06', 143),
(174, 169, 'rrrrr', 8, '2016-09-05 21:57:13', 143),
(175, 169, 'xxxxx', 8, '2016-09-05 22:00:10', 143),
(176, 169, 'xxxxx', 8, '2016-09-05 22:00:19', 143),
(177, 169, 'zzzsss', 8, '2016-09-05 22:00:34', 143),
(178, 169, 'sssssss', 8, '2016-09-05 22:04:02', 143),
(169, 169, '32334234234 333', 8, '2016-09-05 21:51:55', 143),
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305410
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Ой, секунду, отбой. Сам не понял что хочу, сейчас правильно отсортирую.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305414
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notconnected , вообще-то предполагается, что Вы перед публикацией проверите то, что собираетесь публиковать, на работоспособность. И не станете выкладывать заведомо неработоспособную хрень.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305421
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Прошу прощения, все верно, тест-скрипты выше. Просто потом еще этот результат я оберну в JOIN и отсортирую в обратном порядке (от старых к новым).
Сообщения выбираются последние 5 (самые новые комментарии), потом они сортируются в порядке от старых к новым и выводятся, а новые подгружаются сверху.
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305426
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Пардон, потерялось кое-что.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
CREATE TABLE `blogcomments` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `post_id` int(11) unsigned DEFAULT NULL,
  `comment` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user_id` int(11) unsigned DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `parent` int(11) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_foreignkey_blogcomments_post` (`post_id`),
  KEY `index_foreignkey_blogcomments_user` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=188 ;

INSERT INTO `blogcomments` (`id`, `post_id`, `comment`, `user_id`, `created`, `parent`) VALUES
(143, 169, 'wwwewe we we ????', 8, '2016-09-01 19:33:27', 0),
(144, 169, 'wewewe', 8, '2016-09-01 19:33:30', 0),
(145, 58, 'ergerg er ger', 8, '2016-09-01 19:37:10', 0),
(169, 169, '32334234234 333', 8, '2016-09-05 21:51:55', 143),
(170, 169, 'dddd', 8, '2016-09-05 21:54:08', 143),
(171, 169, 'rrrrrr', 8, '2016-09-05 21:54:51', 143),
(172, 169, 'rrrrr', 8, '2016-09-05 21:56:49', 143),
(173, 169, 'rrrrr', 8, '2016-09-05 21:57:06', 143),
(174, 169, 'rrrrr', 8, '2016-09-05 21:57:13', 143),
(175, 169, 'xxxxx', 8, '2016-09-05 22:00:10', 143),
(176, 169, 'xxxxx', 8, '2016-09-05 22:00:19', 143),
(177, 169, 'zzzsss', 8, '2016-09-05 22:00:34', 143),
(178, 169, 'sssssss', 8, '2016-09-05 22:04:02', 143),
(179, 169, 'zzzzzz', 8, '2016-09-05 22:04:10', 0),
(180, 169, 'ssss', 8, '2016-09-05 22:05:57', 144),
(181, 169, 'fffff', 8, '2016-09-05 22:06:01', 144),
(182, 169, 'ffffde333', 8, '2016-09-05 22:06:09', 0),
(183, 169, '554454', 8, '2016-09-05 22:06:20', 0),
(184, 169, 'dddddd', 8, '2016-09-05 22:10:04', 183),
(185, 169, '22222', 8, '2016-09-05 22:12:15', 183),
(186, 169, 'ddddd', 8, '2016-09-05 22:12:35', 183);



Результат:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
(183, 169, '554454', 8, '2016-09-05 22:06:20', 0),
(186, 169, 'ddddd', 8, '2016-09-05 22:12:35', 183),
(185, 169, '22222', 8, '2016-09-05 22:12:15', 183),
(184, 169, 'dddddd', 8, '2016-09-05 22:10:04', 183),
(182, 169, 'ffffde333', 8, '2016-09-05 22:06:09', 0),
(179, 169, 'zzzzzz', 8, '2016-09-05 22:04:10', 0),
(144, 169, 'wewewe', 8, '2016-09-01 19:33:30', 0),
(181, 169, 'fffff', 8, '2016-09-05 22:06:01', 144),
(180, 169, 'ssss', 8, '2016-09-05 22:05:57', 144),
(143, 169, 'wwwewe we we ????', 8, '2016-09-01 19:33:27', 0),
(170, 169, 'dddd', 8, '2016-09-05 21:54:08', 143),
(171, 169, 'rrrrrr', 8, '2016-09-05 21:54:51', 143),
(172, 169, 'rrrrr', 8, '2016-09-05 21:56:49', 143),
(173, 169, 'rrrrr', 8, '2016-09-05 21:57:06', 143),
(174, 169, 'rrrrr', 8, '2016-09-05 21:57:13', 143),
(175, 169, 'xxxxx', 8, '2016-09-05 22:00:10', 143),
(176, 169, 'xxxxx', 8, '2016-09-05 22:00:19', 143),
(177, 169, 'zzzsss', 8, '2016-09-05 22:00:34', 143),
(178, 169, 'sssssss', 8, '2016-09-05 22:04:02', 143),
(169, 169, '32334234234 333', 8, '2016-09-05 21:51:55', 143),
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305454
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
notconnectedРезультат
Непонятна сортировка внутри групп детей. Для групп родителя 183 и родителя 144 - убывание (id или created), а для группы родителя 143 - наоборот (кроме записи id=169, она вообще упала), возрастание... и куда-то запропала запись с id=145...

Если предположить, что в последней группе - косяк, а сортирить надо от новых к старым, то
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
mysql> SELECT t1.*
    -> FROM blogcomments t1, blogcomments t2
    -> WHERE CASE t1.parent WHEN 0 THEN t1.id ELSE t1.parent END = t2.id
    -> ORDER BY
    -> CASE t1.parent WHEN 0 THEN t1.created ELSE t2.created END DESC,
    -> CASE t1.parent WHEN 0 THEN t1.id ELSE t1.parent END,
    -> t1.parent,
    -> t1.created DESC;
+-----+---------+-------------------+---------+---------------------+--------+
| id  | post_id | comment           | user_id | created             | parent |
+-----+---------+-------------------+---------+---------------------+--------+
| 183 |     169 | 554454            |       8 | 2016-09-05 22:06:20 |      0 |
| 186 |     169 | ddddd             |       8 | 2016-09-05 22:12:35 |    183 |
| 185 |     169 | 22222             |       8 | 2016-09-05 22:12:15 |    183 |
| 184 |     169 | dddddd            |       8 | 2016-09-05 22:10:04 |    183 |
| 182 |     169 | ffffde333         |       8 | 2016-09-05 22:06:09 |      0 |
| 179 |     169 | zzzzzz            |       8 | 2016-09-05 22:04:10 |      0 |
| 145 |      58 | ergerg er ger     |       8 | 2016-09-01 19:37:10 |      0 |
| 144 |     169 | wewewe            |       8 | 2016-09-01 19:33:30 |      0 |
| 181 |     169 | fffff             |       8 | 2016-09-05 22:06:01 |    144 |
| 180 |     169 | ssss              |       8 | 2016-09-05 22:05:57 |    144 |
| 143 |     169 | wwwewe we we ???? |       8 | 2016-09-01 19:33:27 |      0 |
| 178 |     169 | sssssss           |       8 | 2016-09-05 22:04:02 |    143 |
| 177 |     169 | zzzsss            |       8 | 2016-09-05 22:00:34 |    143 |
| 176 |     169 | xxxxx             |       8 | 2016-09-05 22:00:19 |    143 |
| 175 |     169 | xxxxx             |       8 | 2016-09-05 22:00:10 |    143 |
| 174 |     169 | rrrrr             |       8 | 2016-09-05 21:57:13 |    143 |
| 173 |     169 | rrrrr             |       8 | 2016-09-05 21:57:06 |    143 |
| 172 |     169 | rrrrr             |       8 | 2016-09-05 21:56:49 |    143 |
| 171 |     169 | rrrrrr            |       8 | 2016-09-05 21:54:51 |    143 |
| 170 |     169 | dddd              |       8 | 2016-09-05 21:54:08 |    143 |
| 169 |     169 | 32334234234 333   |       8 | 2016-09-05 21:51:55 |    143 |
+-----+---------+-------------------+---------+---------------------+--------+
21 rows in set (0.02 sec)
...
Рейтинг: 0 / 0
Правильный последовательный выбор родителей и потомков из одной таблицы
    #39305477
notconnected
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Спасибо огромное! То, что надо!
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Правильный последовательный выбор родителей и потомков из одной таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]