|
|
|
| Друзья помогите составить запрос, есть таблицы
+----------+-----------+-----------+--------+
| 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 | |
+----------+-----------+-----------+--------+
|
Конечно это все можно сделать циклами пхп, но придется кучу раз обращаться к базе, что значительно замедлит работу. | |
|
|
|
|
|
|
|
для: 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 еще одним запросом. | |
|
|
|
|
|
|
|
для: Trianon
(26.02.2007 в 19:55)
| | 1. Огромное спасибо.
2. В том то и дело, что табличка большая, будет порядка 3х миллионов записей. Следовательна таблица будет весить около сотни метров. Даже если загрузить одни ID это уже будет порядка 10 метров... что делать? Как оптимизировать? | |
|
|
|
|
|
|
|
для: Agronom
(27.02.2007 в 14:47)
| | какова предельная глубина вложения?
Если меньше трех десятков - можно посоветовать цепь LEFT JOIN.
Еще можно преобразовать таблицу в nested sets, если добавления / перемещения записей относительно редки, по сравнению с выборками . | |
|
|
|
|
|
|
|
для: Trianon
(27.02.2007 в 14:51)
| | >какова предельная глубина вложения?
Думаю не больше 100 записей.
>Еще можно преобразовать таблицу в nested sets, если добавления / перемещения записей относительно редки, по сравнению с выборками .
А можно тут подробнее?
Заранее спасибо. | |
|
|
|
|