Каков наилучший способ ограничить запрос отсортированными результатами в таблице Closure с полем глубины в MySQL?
Исследование устойчивости иерархических данных и привело меня к закрытию таблиц и составило эту структуру комментариев, основанную на кульминации указанного исследования.
Запросы для создания новых узлов в таблице замыкания были достаточно просты для меня, чтобы понять и извлечь данные для потомков через JOIN
на столе закрытия достаточно просто.
Тем не менее, я хотел бы остановиться на этом и получить результаты обратно отсортированы и ограничены по количеству родителей / детей на глубину х.
Я пытаюсь сделать вещи своевременными / эффективными (я ожидаю, что таблица комментариев станет очень большой), используя внешние ключи и индексы. Я стреляю по запросу "все в одном", который может выполнить то, что я спрашиваю в заголовке, но я не против разбить его, чтобы повысить скорость / эффективность.
Текущие структуры таблицы:
CREATE TABLE `comments` (
`comment_id` int(11) UNSIGNED PRIMARY KEY,
`reply_to` int(11) UNSIGNED NOT NULL DEFAULT '0',
`user_id` int(11) UNSIGNED NOT NULL,
`comment_time` int(11) NOT NULL,
`comment` mediumtext NOT NULL,
FOREIGN KEY (`user_id`) REFERENCES users(`user_id`)
) Engine=InnoDB
CREATE TABLE `comments_closure`(
`ancestor_id` int(11) UNSIGNED NOT NULL,
`descendant_id` int(11) UNSIGNED NOT NULL,
`length` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY(`ancestor_id`, `descendant_id`),
KEY `tree_adl`(`ancestor_id`, `descendant_id`, `length`),
KEY `tree_dl`(`descendant_id`, `length`),
FOREIGN KEY (`ancestor_id`) REFERENCES comments(`comment_id`),
FOREIGN KEY (`descendant_id`) REFERENCES comments(`comment_id`)
) Engine=InnoDB
Более ясное изложение того, что я пытаюсь сделать, это получить 20 комментариев, которые разделяют ancestor_id
, отсортировано по времени. В то же время получение каждого комментария 2 length
глубже (ограничивая их гораздо меньшим количеством 2), также отсортировано по времени.
Однако я не всегда собираюсь сортировать по времени, а также хотел бы получать результаты, отсортированные по их comment_id
Можно ли сделать все это одним запросом? Я не совсем уверен, с чего начать.