Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
netadmin.ws
Панель управления Регистрция свободна! Календарь Список пользователей Часто задаваемые вопросы Поиск по форуму Архив скриптов Главная   
Форум сетевых администраторов
Форум сетевых администраторов Форум сетевых администраторов » Базы данных » MySQL » Опять про оптимизацию запросов
Предыдущая тема     Следующая тема
Автор
Тема    Новая тема     Ответить на эту тему
polo
Администратор
Средний рейтинг: 4.77 | Оценок: 106
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: May 2001
Место проживания:
Публикаций: 4642
Статус: polo в оф-лайне
Опять про оптимизацию запросов [сообщение #80236]

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

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' то прасматривается только одна запись. Почему так происходит и как с этим боротся?

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

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 14-01-2006 14:12
Нажмите сюда для просмотра профайла polo Отправить Персональное сообщение polo Посетить домашнию страничку polo! Найти сообщения от polo Добавить polo в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя
Viktor
Участник+
Средний рейтинг: 4.89 | Оценок: 19
/нажмите чтобы посмотреть кто оценивал/

Зарегистрирован: Jun 2002
Место проживания: Украина
Публикаций: 617
Статус: Viktor в оф-лайне
[сообщение #80238]

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

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

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

Сообщение было отредактировано Viktor 16-01-2006 в 07:42

Сообщить модератору об этом сообщении | Предупреждение | IP: определен

Old Post 16-01-2006 07:40
Нажмите сюда для просмотра профайла Viktor Отправить Персональное сообщение Viktor Посетить домашнию страничку Viktor! Найти сообщения от Viktor Добавить Viktor в свой список друзей Редактировать/Удалить сообщение Ответить Цитируя



Формат времени GMT. Текущее время 18:15.
Новая тема   Ответить на эту тему [ Версия для печати Печать | Отправить эту страницу другу/знакомому! Отправить | Получать уведомления об обновлении этой темы Подписка ] Предыдущая тема     Следующая тема
Навигация по форуму:
Оценка темы:

Правила форума:
Вы не можете создавать новые темы.
Вы не можете отвечать на существующие темы.
Вы не можете прикреплять файлы.
Вы не можете редактировать свои сообщения.
HTML теги выкл.
Спец. код вкл.
Смайлики вкл.
[IMG] тег выкл.
 

Page generated in 0.13943195 seconds (96.00% PHP - 4.00% MySQL) with 21 queries.


  Главная :: Форум :: Web ClipArt :: Поиск :: Статистика :: Топ 10 :: Публикация :: Рекомендовать
©NetAdmin.ws, 2001-2026.
Powered by: vBulletin
Copyright ©2000, 2001, Jelsoft Enterprises Limited.