Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с несколькими Left Join к одной таблице / 19 сообщений из 19, страница 1 из 1
19.05.2020, 16:48
    #39959582
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Здравствуйте!
Есть 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
19.05.2020, 16:51
    #39959583
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Vladimir_KZN,

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

т.е. зачем это 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
20.05.2020, 08:46
    #39959753
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
miksoft, нужно выбрать смежный товар с общем значением param. По логике больше чем у двух товаров не может быть общее значение param.
...
Рейтинг: 0 / 0
20.05.2020, 08:50
    #39959755
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Alex_Ustinov, По логике больше чем у двух товаров не может быть общее значение param.
На 25 000 товаров запрос выполняется 1.25 сек. Думаю это из-за нескольких left join...
...
Рейтинг: 0 / 0
20.05.2020, 08:51
    #39959758
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Alex_Ustinov, param_id это уникальный ключ таблицы, забыл сказать, простите.
...
Рейтинг: 0 / 0
20.05.2020, 09:06
    #39959763
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Vladimir_KZN
По логике больше чем у двух товаров не может быть общее значение param.
Эта логика поддержана соответствующим constraint? нет? значит, этой логики - НЕТ.
И тогда на вопрос
Vladimir_KZN
на сколько верно такое исполнение?
ответ однозначен - НЕТ, неверно вообще.

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

1) Показывайте РЕАЛЬНЫЕ DDL таблиц
2) Показывайте РЕАЛЬНЫЙ текст запроса
3) Показывайте статистику таблиц
4) Показывайте EXPLAIN запроса
...
Рейтинг: 0 / 0
20.05.2020, 14:10
    #39959853
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Vladimir_KZN
Alex_Ustinov, param_id это уникальный ключ таблицы, забыл сказать, простите.
да это по смыслу запроса неважно. Он выводит ВСЕвозможные пары товаров с одинаковыми параметрами
...
Рейтинг: 0 / 0
20.05.2020, 14:39
    #39959862
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Alex_Ustinov, в принципе да, есть ли у вас варианты как можно по другому решить задачу?
...
Рейтинг: 0 / 0
20.05.2020, 15:04
    #39959870
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
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
20.05.2020, 16:54
    #39959953
Vladimir_KZN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с несколькими Left Join к одной таблице
Alex_Ustinov,

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

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

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


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