Форум сетевых администраторов
Показаны 2 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- MySQL (http://netadmin.ws/forum/forumdisplay.php?forumid=40)
-- Опять про оптимизацию запросов (http://netadmin.ws/forum/showthread.php?threadid=11375)


Помещено polo 14-01-2006 в 14:12:

Опять про оптимизацию запросов

Имеется таблица:

code:

cols   | types
-----------------
id     | PRIMARY
uniqid | VARCHAR(7) UNIQUE
col_1  | CHAR(2)
col_2  | TINYIN(2)
col_3  | SMALLINT(3) 
name   | VARCHAR(30)


uniqid формаируется из col_1 + col_2 + col_3 дополненые нулями слева до нужной длины.
Допустим имеем данные:

code:
id   | uniqid    | col_1 | col_2 | col_3 | name
-------------------------------------------------
1    | aa        | aa    | NULL  | NULL  | name 1
2    | aa04      | aa    | 4     | NULL  | name 2
3    | aa04058   | aa    | 4     | 58    | name 3


Как можно заметить данные имеют древовидную структуру с 3-мя максимальными вложениями. Нужно создать запрос чтобы выбрать 3-ю запись и имена всех ее родителей:

PHP:

SELECT a
.*, b.name AS col_2_name, c.name AS col_1_name
FROM table 
AS a
LEFT JOIN table 
AS b ON (b.uniqid = CONCAT(a.col_1, LPAD(a.col_2, 2, 0))
LEFT JOIN table AS c ON (c.uniqid = a.col_1
WHERE a
.id=3


Впринципе все хорошо, но при наличии 10 000 записей таблица второе объеденение обходит все 10000 записей, проблема в CONCAT, если явно указать b.uniqid = 'aa04' то прасматривается только одна запись. Почему так происходит и как с этим боротся?

__________________
Всегда есть решение.


Помещено Viktor 16-01-2006 в 07:40:

А если заменить

code:

b.uniqid = CONCAT(a.col_1, LPAD(a.col_2, 2, 0)


на что-то такое (пробовал на SQL Server)

code:
b.uniqid = left(a.uniqid, 4)



+ зачем использовать LEFT JOIN если у потомка однозначно есть предки?

Если проблемы с объединением, то можно просто выполнить вложенные запросы

Например,

code:
SELECT a.*, 
(select name FROM table where uniqid = left(a.uniqid, 4)) AS col_2_name, 
(select name FROM table where uniqid = a.col_1) AS col_1_name 
FROM table as a 
WHERE a.id=3

__________________
Тест - проверка верности!


Формат времени GMT. Текущее время 21:58.
Показаны 2 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.