Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Хитрый запрос к одной таблице
 
 автор: Agronom   (26.02.2007 в 18:58)   письмо автору
 
 

Друзья помогите составить запрос, есть таблицы

+----------+-----------+-----------+--------+
|   ID     | login     |  userid   | data   |
+----------+-----------+-----------+--------+
|   1      | login1    |  2        |        |
|   2      | login2    |  4        |        |
|   3      | login3    |  4        |        |
|   4      | login4    |  1        |        |
|   5      | login5    |  1        |        |
|   6      | login6    |  3        |        |
+----------+-----------+-----------+--------+

делаем выборку и получаем первые 2 строчки. а вот как бы связвть userid c id этой же таблицы, чтобы в каждую из этих 2 строк добавить пользователей с id равным userid в выборке, т.е.:

+----------+-----------+-----------+--------+
|   1      | login1    |  2        | login2 |
|   2      | login2    |  4        | login4 |
+----------+-----------+-----------+--------+


и еще один запрос к этой таблице:
Как циклически беребрать пользователей построчно в табличку, т.е. у нас есть 2 входящих параметра, например id = 6 и id = 1в итоге мы должны отыскать пользователя с id = 6, это login6, это первая строка, посмотреть его userid (3) ищем пользователя с id = 3, это login3 - вторая строка и
т.д. пока не встретим второй входной параметр id = 1, причем если id = 1 мы не встречаем, то составляем таблицу до id = 0 (это 3й параметр, например id c 0 встретится обязательно)
итого результат должен быть.

+----------+-----------+-----------+--------+
|   6      | login6    |  3        |        |
|   3      | login3    |  4        |        |
|   4      | login4    |  1        |        |
|   1      | login1    |  2        |        |
+----------+-----------+-----------+--------+

Конечно это все можно сделать циклами пхп, но придется кучу раз обращаться к базе, что значительно замедлит работу.

   
 
 автор: Trianon   (26.02.2007 в 19:55)   письмо автору
 
   для: Agronom   (26.02.2007 в 18:58)
 

Если userid прочесть как parent_id, получится обычный adj list.
1

SELECT t1.id, t1.login, t2.id, t2.login 
  FROM users as t1 
    LEFT JOIN users as t2 ON t2.id = t1.userid

2
Каков размер таблицы логинов?

a)Загрузите все id и userid одним запросом.
b)Организуйте цикл (а при необходимости и рекурсивный обход) средствами php, не привлекая sql. Сформируйте список требуемых id
c) Загрузите требуемые данные для всего списка id еще одним запросом.

   
 
 автор: Agronom   (27.02.2007 в 14:47)   письмо автору
 
   для: Trianon   (26.02.2007 в 19:55)
 

1. Огромное спасибо.

2. В том то и дело, что табличка большая, будет порядка 3х миллионов записей. Следовательна таблица будет весить около сотни метров. Даже если загрузить одни ID это уже будет порядка 10 метров... что делать? Как оптимизировать?

   
 
 автор: Trianon   (27.02.2007 в 14:51)   письмо автору
 
   для: Agronom   (27.02.2007 в 14:47)
 

какова предельная глубина вложения?
Если меньше трех десятков - можно посоветовать цепь LEFT JOIN.

Еще можно преобразовать таблицу в nested sets, если добавления / перемещения записей относительно редки, по сравнению с выборками .

   
 
 автор: Agronom   (27.02.2007 в 16:01)   письмо автору
 
   для: Trianon   (27.02.2007 в 14:51)
 

>какова предельная глубина вложения?

Думаю не больше 100 записей.

>Еще можно преобразовать таблицу в nested sets, если добавления / перемещения записей относительно редки, по сравнению с выборками .

А можно тут подробнее?
Заранее спасибо.

   
 
 автор: Trianon   (27.02.2007 в 16:04)   письмо автору
 
   для: Agronom   (27.02.2007 в 16:01)
 

http://phpclub.ru/faq/wakka.php?wakka=Tree&v=w5u

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования