Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Правильный последовательный выбор родителей и потомков из одной таблицы / 19 сообщений из 19, страница 1 из 1
06.09.2016, 15:42
    #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
06.09.2016, 15:47
    #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
06.09.2016, 16:25
    #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
06.09.2016, 19:14
    #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
06.09.2016, 20:21
    #39304716
notconnected
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
Akina,

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

Но еще надо поправить сортировку. Верхний цровень должен сортироваться по дате создания 'created' DESC, а второй уровень локально по этому же полю. Никак не пойму как реализовать, нужно в результате запроса получить уже готовое дерево комментариев от новых к старым, но ответы на комментарии (второй уровень) должны сортироваться не в общем потоке, а локально в своей группе одного родителя.
...
Рейтинг: 0 / 0
06.09.2016, 21:53
    #39304745
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
notconnectedнадо поправить сортировку. Верхний цровень должен сортироваться по дате создания 'created' DESC, а второй уровень локально по этому же полю. Никак не пойму как реализоватьА вот тут уже нужны две копии. После связывания аналогично добавить CASE-вычисляемое поле сортировки, содержащее created родителя или (если сам родитель) свой. Причём самым первым.
...
Рейтинг: 0 / 0
07.09.2016, 11:11
    #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
07.09.2016, 11:50
    #39305031
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
notconnectedЧто-то вроде этогоБлизко не лежало...
...
Рейтинг: 0 / 0
07.09.2016, 16:09
    #39305327
notconnected
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
Akina,

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

ээээм, а можно для совсем одаренных как-то раскрыть это понятие? :)
Я через phpmyadmin все делаю, а запрос будет в php использоваться.
...
Рейтинг: 0 / 0
07.09.2016, 17:23
    #39305380
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
notconnectedможно для совсем одаренных как-то раскрыть это понятие?Два запроса. CREATE TABLE и INSERT INTO. Чтобы можно было создать точную копию твоей таблицы и с твоими данными. Ну и, само собой, желаемый результат, причём именно на этих данных.
...
Рейтинг: 0 / 0
07.09.2016, 17:51
    #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
07.09.2016, 17:54
    #39305410
notconnected
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
Akina,

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

Прошу прощения, все верно, тест-скрипты выше. Просто потом еще этот результат я оберну в JOIN и отсортирую в обратном порядке (от старых к новым).
Сообщения выбираются последние 5 (самые новые комментарии), потом они сортируются в порядке от старых к новым и выводятся, а новые подгружаются сверху.
...
Рейтинг: 0 / 0
07.09.2016, 18:13
    #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
07.09.2016, 19:09
    #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
07.09.2016, 19:55
    #39305477
notconnected
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Правильный последовательный выбор родителей и потомков из одной таблицы
Akina,

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


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