Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> LEFT JOIN + LIKE, CONCAT у меня почемуто не работает 
V
    Опции темы
KuZyagroup
Дата 13.4.2010, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



Есть две таблицы:
node:
--nid -id
--title - text
menu_links
--mlid -id
--weight -int
--link_path -text (выглядит как node/%, где вместо % node.nid)

Мне нужно выбрать первую таблицу, зацепив поле weight из второй
Код

SELECT 
    node.nid, 
    node.title,    
    menu.weight    
FROM node node
INNER JOIN menu_links menu ON node.nid LIKE CONCAT( '%', menu.link_path)
WHERE node.type IN ('typical')
    AND node.language = 'ru'


Такой код на примере
table node
Код

nid    title
115    Лекарственные средства
118    Медицинские переводы
121    Индустрия
124    Медицинские изделия
127    Пищевые добавки и косметика

table menu
Код

mlid    link_path     weight 
658    "node/127"      -3
646    "node/115"      -2
649    "node/118"      -1
652    "node/121"      0
655    "node/124"      1
893     ""             0

Результат запроса
Код

nid    title                            mlid    weight    link_path
115    Лекарственные средства           893    0        ""
118    Медицинские переводы             893    0        ""
121    Индустрия                        893    0        ""
124    Медицинские изделия              893    0        ""
127    Пищевые добавки и косметика      893    0        ""

PM MAIL   Вверх
Akina
Дата 13.4.2010, 14:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Замени связывание отбором. Вместо Like используй Instr > 0 или сравнение с Substr(field from 6 for 3).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
KuZyagroup
Дата 13.4.2010, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



Спасибо огромное! Коротко, ясно, помогло
Код

SELECT node.nid, node.title, menu.weight
FROM node node
INNER JOIN menu_links menu ON INSTR( menu.link_path, node.nid ) >0
WHERE node.type
IN (
'typical'
)
AND node.language = 'ru'
LIMIT 0 , 30

PM MAIL   Вверх
skyboy
Дата 13.4.2010, 14:44 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(KuZyagroup @  13.4.2010,  13:23 Найти цитируемый пост)
node.nid LIKE CONCAT( '%', menu.link_path)

должно быть наоборот:
Код

menu.link_path LIKE CONCAT( '%', node.nid)

но так делать не надо. потому что нагрузка.
вариант Akina можно использовать как временный. 
а лучше - разделить поле "link_path" на строковую составляющую и числовую.
и тогда было бы:
Код

ON menu.link_path_node = node.nid
...
WHERE ...
menu.link_path_type = 'node'

в таком случае могут использоваться ключи и при прочих равных, вариант с concat/locate/substr будет проигрывать и по скорости, и по логичности записи/читабельности, и по расширяемости
PM MAIL   Вверх
KuZyagroup
Дата 13.4.2010, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


magento solution
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 16.4.2007
Где: Kiev

Репутация: нет
Всего: 4



2skyboy, спасибо за быстрый ответ. 
Код

SELECT node.nid, node.title, menu.weight
FROM node node
INNER JOIN menu_links menu ON menu.link_path LIKE CONCAT( '%', node.nid )
WHERE node.type
IN (
'typical'
)
AND node.language = 'ru'


Тоже отлично работает.
Я чуть-чуть не понял, какой из вариантов лучше использовать. То есть что меньше грузит систему.

Цитата(skyboy @  13.4.2010,  14:44 Найти цитируемый пост)
а лучше - разделить поле "link_path" на строковую составляющую и числовую.

Я бы с радостью, но эта таблица друпала, модуль ядра(


PM MAIL   Вверх
Akina
Дата 13.4.2010, 15:09 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(KuZyagroup @  13.4.2010,  15:50 Найти цитируемый пост)
Я чуть-чуть не понял, какой из вариантов лучше использовать. То есть что меньше грузит систему.

При трёх символах для сравнения меньше будет тормозить систему фиксированный SUBSTR имхо...
Вот только мне непонятно, почему надо использовать непременно menu.link_path LIKE CONCAT( '%', node.nid ), если префикс постоянен и можно использовать прямое сравнение подстроки или конкатенацию префикса, уходя от Like к строгому сравнению, заведомо более быстрому?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.