 |
|

07.02.2009, 20:23
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
С нами:
10143686
Репутация:
526
|
|
Для 2-х уровней Хелиос написал адекватный запрос (в отличии от большинства написанного в этом топике). Если же необходимо большее количество уровней (зачастую неопределенное) впринципе можно использовать хп, но понадобится минимум 2 курсора. Преимуществ здесь будет 2:
1) Сразу возвращаем полный и нужный нам результат
2) Сохраняется план выполнения данных запросов на серваке, что, при правильном подходе,
увеличит скорость работы.
|
|
|

07.02.2009, 20:36
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
С нами:
10562786
Репутация:
537
|
|
Helios
спасибо, как раз то, что нужно.
я не знал что в in() можно передавать запрос.
VDShark
что такое хп и курсоры?
|
|
|

07.02.2009, 20:41
|
|
Постоянный
Регистрация: 19.03.2007
Сообщений: 684
С нами:
10077446
Репутация:
1020
|
|
Сообщение от Helios
Код:
SELECT *
FROM `comments`
WHERE `parent_id` = NULL
OR `parent_id` IN (
SELECT `id` FROM `comments` WHERE `parent_id` =NULL)
Я не вижу смысла выполнения этого запроса, критерии по которым выбераються данные при главном запросе идентичны тем которые идут в подзапросе, в итоге мы получаем тот же результат что и в основном запросе просто лишний раз проходим по таблице.
|
|
|

07.02.2009, 20:51
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
С нами:
10143686
Репутация:
526
|
|
Сообщение от AkyHa_MaTaTa
Я не вижу смысла выполнения этого запроса, критерии по которым выбераються данные при главном запросе идентичны тем которые идут в подзапросе, в итоге мы получаем тот же результат что и в основном запросе просто лишний раз проходим по таблице.
А если подумать немного?  Выполни такие запросы и посмотри результат, м.б. натолкнет на ответ.
> что такое хп и курсоры?
ХП - сокращение от Хранимые Процедуры. Т.е. код хранящийся на стороне сервера и вызываемый по имени. А курсоры - это, грубо говоря, аналог циклов трационных языков программирования (другими словами - способ перемещения по кортежам и работы с ними, указатель на полученное отношение). Ну это я попытался рассказать попонятнее... Но можешь прочитать об этом в той же википедии (хоть там и не особо расписано) - http://ru.wikipedia.org/wiki/Курсор_(базы_данных)
|
|
|

07.02.2009, 20:54
|
|
Постоянный
Регистрация: 19.03.2007
Сообщений: 684
С нами:
10077446
Репутация:
1020
|
|
Сообщение от VDShark
А если подумать немного?  Выполни такие запросы и посмотри результат, м.б. натолкнет на ответ.
Может это тебе зделать(прежде чем что писать я всгда проверяю свои слова).
|
|
|

07.02.2009, 20:57
|
|
Постоянный
Регистрация: 14.01.2007
Сообщений: 459
С нами:
10169427
Репутация:
589
|
|
Сообщение от AkyHa_MaTaTa
Я не вижу смысла выполнения этого запроса, критерии по которым выбераються данные при главном запросе идентичны тем которые идут в подзапросе, в итоге мы получаем тот же результат что и в основном запросе просто лишний раз проходим по таблице.
Запросы разные вообще-то и результаты выполнения их тоже разные, в чем можно убедиться, скормив запрос базе данных.
Подзапрос возвращает ID элементов в корне. А основной запрос делает выборку этих элементов и их потомков. Без подзапроса ты просто этих потомков не найдешь.
|
|
|

07.02.2009, 20:58
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
С нами:
10143686
Репутация:
526
|
|
Сообщение от AkyHa_MaTaTa
Может это тебе зделать(прежде чем что писать я всгда проверяю свои слова).
Видимо данные на которых ты проверял были не учитывающими данную ситуацию... в чем я сильно сомневаюсь. Поэтому необходимо включать соображалку хотя бы иногда, а не безосновательно буровить на людей.
|
|
|

07.02.2009, 21:01
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
С нами:
10562786
Репутация:
537
|
|
а всё-таки есть проблема с таким подходом.
вот мой запрос:
PHP код:
SELECT *
FROM comment
WHERE tid =1
AND parentid IS NULL
OR parentid
IN (
SELECT cid
FROM comment
WHERE tid =1
AND parentid IS NULL
ORDER BY ctime ASC
)
ORDER BY ctime ASC
LIMIT 0 , 10
таким образом: сначала выполняется подзапрос. он возвращает ВСЕ id у которых tid=1 - ну типа комменты относятся к определенной теме.
а потом уже мы выбираем вложенные комменты к этим комментам.
но мне надо выбрать от n до m комментов в подзапросе, т.к. у меня пейджинг.
а mysql говорит что её версия (5.0.15-nt) не поддерживает limit в подзапросах..
как это исправить? есть ещё какие-то способы выполнить подзапрос, но с лимитом?
|
|
|

07.02.2009, 21:02
|
|
Постоянный
Регистрация: 19.03.2007
Сообщений: 684
С нами:
10077446
Репутация:
1020
|
|
Ну вобшето я даже и не предполагал на кого то буровить, если это так воспринял то извеняй, а теперь по делу, если тебе несложно покажи ту структуру данных при которых даный запрос будет работать, ибо как ты заметил моей сображалки не хватает, покажи плиз свою.
|
|
|

07.02.2009, 21:05
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
С нами:
10143686
Репутация:
526
|
|
Сообщение от AkyHa_MaTaTa
Ну вобшето я даже и не предполагал на кого то буровить, если это так воспринял то извеняй, а теперь по делу, если тебе несложно покажи ту структуру данных при которых даный запрос будет работать, ибо как ты заметил моей сображалки не хватает, покажи плиз свою.
Извиняю, надеюсь ты действительно не имел ввиду ничего дурного 
А по делу - если вообще не будет потомков (т.е. у всех записей будет pid=0), тогда вернутся идентичные рзультаты, иначе же будут утеряны родители (если запрос без where pid=0).
|
|
|
|
 |
|
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|