powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с несколькими Left Join к одной таблице
19 сообщений из 19, страница 1 из 1
Запрос с несколькими Left Join к одной таблице
    #39959582
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть 2 таблицы (упростил до минимума)

products
_____
product_id | name
1 | tovar1
2 | tovar2
3 | tovar3
4 | tovar4
5 | tovar5

и

product_desc
_____
param_id | param | product_id
1 | param1 | 1
2 | param2 | 2
3 | param1 | 4
4 | param4 | 3
5 | param5 | 5

Стандартная выборка с left join выглядит так

Код: sql
1.
SELECT p.product_id, p.name, pd.param FROM products p LEFT JOIN product_desc pd ON p.product_id = pd.product_id



Далее хотелось бы добавить еще один столбец в выборку с product_id, при условии если есть одинаковый param для разных product_id, добавив к запросу еще один left join, в итоге получается такой запрос

Код: sql
1.
2.
SELECT p.product_id, p.name, pd.param, pd2.product_id AS product_param FROM products p LEFT JOIN product_desc pd ON p.product_id = pd.product_id
LEFT JOIN product_desc pd2 ON pd.param = pd2.param



Подскажите пожалуйста на сколько верно такое исполнение? Мне кажется можно более эффективнее реализовать, но не знаю как, подскажите люди добрые.
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959583
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN,

По идее, во втором запросе должно быть соединение по полю product_id, а не по param.
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959590
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить условие AND pd2.product_id != p.product_id
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959594
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал fiddle
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959596
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN
Забыл добавить условие AND pd2.product_id != p.product_id
Это что-то странное.
Тогда рассказывайте логику ваших таблиц и запросов.
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959603
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZNПодскажите пожалуйста на сколько верно такое исполнение? Мне кажется можно более эффективнее реализовать, но не знаю как, подскажите люди добрые.запрос работает как вам надо, значит все верно. Эффективность здесь искать не надо. (если у вас не этажерка из LEFT JOIN)
Не хочется экспериментировать, но что будет если одинаковые параметры у 3-4 продуктов?
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959746
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а что там экпериментировать, есть же фидддл

т.е. зачем это fiddle

копия рез-таproduct_id name param product_param1 tovar1 param1 42 tovar2 param2 3 tovar3 param4 53 tovar3 param4 44 tovar4 param4 54 tovar4 param4 34 tovar4 param1 15 tovar5 param5 5 tovar5 param4 45 tovar5 param4 3
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959753
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, нужно выбрать смежный товар с общем значением param. По логике больше чем у двух товаров не может быть общее значение param.
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959755
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov, По логике больше чем у двух товаров не может быть общее значение param.
На 25 000 товаров запрос выполняется 1.25 сек. Думаю это из-за нескольких left join...
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959758
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov, param_id это уникальный ключ таблицы, забыл сказать, простите.
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959763
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN
По логике больше чем у двух товаров не может быть общее значение param.
Эта логика поддержана соответствующим constraint? нет? значит, этой логики - НЕТ.
И тогда на вопрос
Vladimir_KZN
на сколько верно такое исполнение?
ответ однозначен - НЕТ, неверно вообще.

Vladimir_KZN
На 25 000 товаров запрос выполняется 1.25 сек.
Если результат запроса правильный, и речь зашла об оптимизации, то:

1) Показывайте РЕАЛЬНЫЕ DDL таблиц
2) Показывайте РЕАЛЬНЫЙ текст запроса
3) Показывайте статистику таблиц
4) Показывайте EXPLAIN запроса
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959853
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN
Alex_Ustinov, param_id это уникальный ключ таблицы, забыл сказать, простите.
да это по смыслу запроса неважно. Он выводит ВСЕвозможные пары товаров с одинаковыми параметрами
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959862
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov, в принципе да, есть ли у вас варианты как можно по другому решить задачу?
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959870
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN, если не ошибаюсь - второй LEFT JOIN можно заменить на INNER JOIN
я так понял, что
основной запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
  t1.product_id, 
  t2.product_id, 
  t1.param  
from 
  product_desc as t1 , 
  product_desc as t2 
where
  t1.param= t2.param and t1.product_id <> t2.product_id order by t1.product_id

а дальше как его применить - дело конкретной задачи
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39959953
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

Отлично, только ваш запрос выводит запись если есть смежный товар. А как вывести все записи, только если есть смежный товар, то выводить в соответствующий столбец, если нет, то выводить null ?
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39960012
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN,

да все то же самое как и было.
products Left Join ...
задача то какая? зеркальные пары обязательно нужны?
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39960175
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov, нет, зеркальные пары не обязательны. Задача без left join запрос составить или же оптимизировать запрос с left join, чтобы результат вывода был таков fiddle
Попробовал избавиться от зеркальных пар с помощью group by, но не вышло
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39960208
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir_KZN,

если нужны "все" записи, то это только Left Join
если нужно избавиться от зеркальных пар, то запрос непонятен
по оптимизации - смотрите план запроса и какие индексы используются
...
Рейтинг: 0 / 0
Запрос с несколькими Left Join к одной таблице
    #39960214
Vladimir_KZN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov, спасибо вам. Ваши наводки помогли мне. Удалось сократить время выполнения запроса с 1.25 до 0.20.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с несколькими Left Join к одной таблице
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]