Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

07.02.2009, 21:11
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
PHP код:
SELECT *
FROM `comments`
WHERE `parent_id` = NULL
OR `parent_id` IN (
SELECT `id` FROM `comments` WHERE `parent_id` =NULL)
AkyHa_MaTaTa
ты и меня смутил. но я понял в чем суть.
сначала вложенный запрос выбирает все комментарии первого уровня (как раз лимита на это я и не могу поставить)
затем основной запрос выбирает опять комментарии первого уровня (где парент_ид НУЛЛ) - это кстати совсем лишнее И выбирает комментарии второго уровня, у которых парент_ид лежит в области тех ид, что выбраны в самом начале.
убираем из основного запроса "WHERE `parent_id` = NULL", и каким-то образом добавляем лимит во вложенный запрос - вот то что необходимо для того, чтобы выбрать только нужные комменты и ВСЕ их подкомменты.
|
|
|

07.02.2009, 21:17
|
|
Members of Antichat - Level 5
Регистрация: 09.05.2008
Сообщений: 304
Провел на форуме: 7875940
Репутация:
2362
|
|
Дикс, если есть возможность изменить структуру таблицы, тогда советую почитать про nested sets. Этот метод очень хорош для выборки поддерева.
|
|
|

07.02.2009, 21:25
|
|
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
Провел на форуме: 1469995
Репутация:
589
|
|
Если убрать проверку на `parent_id` = NULL из основного запроса, то ты получишь только комментырии второго уровня.
Подзапрос не выбирает комментарии первого уровня, он только находит их идентификаторы, по которым мы выбираем комменты второго уровня.
Как я понял, ты берешь на страницу N комментариев первого уровня и всех их потомков. В таком случае вижу два выхода:
Первый из них - выбирать все и брать нужное средствами PHP, что совсем не айс. Потому метод отбрасываем.
Второй - все таки разделить на два запроса:
Код:
SELECT * FROM `comments` WHERE `parent_id` = NULL AND `t` = '1' LIMIT 0,5
Для выбора комментов первого уровня. Также сз полученных данных выбираешь id этих комментов и составляешь второй запрос:
Код:
SELECT *
FROM `comments`
WHERE `parent_id` IN ( $id_list )
И уже отсюда выбираешь комменты второго уровня.
Решение не из самых красивых, но это все же не рекурсия - влаживаем все в два запроса.
|
|
|

07.02.2009, 21:27
|
|
Постоянный
Регистрация: 30.08.2007
Сообщений: 773
Провел на форуме: 3069349
Репутация:
808
|
|
Сообщение от oRb
Дикс, если есть возможность изменить структуру таблицы, тогда советую почитать про nested sets. Этот метод очень хорош для выборки поддерева.
Этот метод действительно хорош для статичных деревьев, а дерево комментариев, очевидно, таким не является.
|
|
|

08.02.2009, 10:02
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
http://forum.ixbt.com/topic.cgi?id=26:39140
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|