powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Несколько Join таблицы саму на себя
19 сообщений из 44, страница 2 из 2
Несколько Join таблицы саму на себя
    #40004850
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,

Как понял "не совсем". Фасеты (мож ошибаюсь) это последовательный параметризованный поиск. Выбрали срез - показали (заодно сохранили, урезав выборку) и так постепенно добавляем параметры отбора.

Это полноценный параметризованный поиск по параметрам - выбрали набор параметров и жмакнули "и-щи!" получили результом только то что надо.

Оба подхода имеют место быть и у каждого свои плюсики, как и минусики, кмк. :)
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004861
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже по вашему описанию разницу не видно.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004865
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrow,
Разница в реализации. В фасете делаем несколько стартовых view с начальным параметром и прячем в кеш (типо для ускорения первичной выборки), а во втором случае сразу прописываем сложный запрос с кучей параметров и получаем весь результ на руки единовременно.

Фасетный поиск, как вариант, ещё вместо выборок в кеш сохраняют отдельные профили индексов "типа предвыборка".. в любом разе, это несколько последовательных этапов (запросов) по 1шт на новый параметр на базе предыдущей выборки.

.. ну это как делал, как понимаю .. оф. терминология (Вики):

".. Фасетный поиск позволяет перемещаться по многомерному информационному пространству через объединение текстового поиска с постепенным сужением выбора в каждом измерении .."

Реализуется на веб странице параметрической формой, где каждый выбор, тут же показывает "нашлось ххх товаров" .. т.е. часть поиска проведена по этому параметру и создана "фасета" (врем. тбл)..

То что тут - это одновременная (разовая) выборка по всему комплекту сразу... собственно "вся разница". :)
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004871
para_bit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,

добрый день, я такое из коробки только про Битрикс слышал, я так понимаю, что реализовать это не так просто, подскажите, что почитать?
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004909
para_bit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,

не совсем понял о какой логической функции в SELECT вы говорите?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SELECT SQL_NO_CACHE p.product_id, p.model 
  , SUM( pa.attribute_id IN(2, 33)) cntGrpA
  , SUM( pa.attribute_id IN(4, 38)) cntGrpB
  , SUM( pa.attribute_id IN(7, 13)) cntGrpC
  , SUM( pa.attribute_id IN(8)) cntGrpD
  , SUM( pa.attribute_id IN(9, 428, 386, 28, 39)) cntGrpE
  , SUM( pa.attribute_id IN(6,27)) cntGrpF
  , SUM( pa.attribute_id IN(632,103)) cntGrpG
  , SUM( pa.attribute_id IN(10) ) cntGrpK
FROM oc_product p
INNER JOIN oc_product_attribute pa ON pa.product_id = p.product_id
INNER JOIN oc_product_to_category p2c ON  p2c.product_id = p.product_id
WHERE pa.attribute_id in (2, 4, 6, 7, 8, 9, 10, 13, 27, 28, 33, 38, 39, 103, 428, 386, 632) AND p.quantity>0
    AND p.manufacturer_id IN (4) AND p2c.category_id IN (1, 46, 81)
GROUP BY p.model, pa.product_id 
HAVING (cntGrpA*cntGrpB*cntGrpC*cntGrpD*cntGrpE*cntGrpF*cntGrpG*cntGrpK) > 0



разбирался с вариантом который вы предложили и правда интересно, но время выполнения 0.9268 сек. т.е. похоже, что доп. условия не влияли на скорость фильтрации
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004926
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
para_bit,
Эта модификация и не должна быть быстрее, разве что очень незначительно, т.к. объем выборки тут не изменен по сравнению в пред. вариантом - группируются теже строки. Тут просто наглядней что суммирование - это вычисление попадания в группы, наличие которых Вы потом требуете в HAVING.
Так кмк наглядней что ищется.

Меня интересовало сравнение с другими вариантами запросов, что Вы привели раньше, для одних и тех же данных и условий поиска.
Особенно с вариантом 3.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004940
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
para_bit
ScareCrow,

добрый день, я такое из коробки только про Битрикс слышал, я так понимаю, что реализовать это не так просто, подскажите, что почитать?


штатно это есть в Эластике и Сфинксе.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004970
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
НеофитSQL
замените все джойны на RIGHT JOIN
Не поясните логику этого (признаться, странного) совета?


Этот совет следует логике фасетной фильтрации (я не знал этого термина), которая обсуждалась позже в этой теме.

Будучи новичком в SQL, я пока некомфортно отношусь к огромному числу комбинаторных вариантов порожденными inner join восьмой степени. Ошибка в условии WHERE может привести в взрывному (миллионы раз) увеличению числа строк.

Right join позволяет мне думать об этой задаче как о последовательной фильтрации таблицы product_attribute, с кардинальностью возможного ответа не превышающего размера product_attribute, и (для меня) более простой отладке в случае ошибки.


Я понимаю оптимизатор SQL это умная штука, и может исполнять inner join очень эффективно, несмотря на кажущиеся миллиарды комбинаций в десятой степени. ТС сравнил скорость inner/right join, скорость оказалась одинаковой - это говорит о качестве оптимизатора.

Надеюсь, ответил на ваш вопрос.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40004997
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

Код: sql
1.
InnoDb и даже лучше в xtraDb 


ну это как бы одно "яйцо")
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005190
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Надеюсь, ответил на ваш вопрос.
Это да... впрочем, ответ, уж извините, "для галочки" - да, теперь нельзя сказать, что вопрос проигнорирован.

Но я навылет не понимаю, где хоть какая-то точка соприкосновения между различиями в логике получения результатов (вернее, каким условиям отвечают записи, различающие наборы для внутреннего и правого связываний) и этим обоснованием. "Скажите, а вы не пробовали мочу молодого поросёнка?" (с)

Что же до тутошнего, частного, случая:
Код: sql
1.
2.
3.
4.
SELECT ...
FROM product p
INNER JOIN ...
WHERE p.quantity > 0 ...


Продолжать?
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005205
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

лол, я как раз вернулся дополнить мое сообщение. меа кулпа.

Я позже понял что мое предложение с левым джойн было совершенно бессмысленным, т.к. я неверно о них думал, после нескольких недель левых джойнов по уникальным ключам (там они действительно не увеличивают кардинальность).
Досадная ошибка, которую я бы может и не сделал бы днем или месяц назад :)

Вот что я надеялся сделать. Привожу несколько строчек от ТС для удобства обсуждения:
Код: sql
1.
2.
3.
        AND pa1.attribute_id IN (12, 23)
        AND pa2.attribute_id IN (2, 37, 42, 54, 1)
        AND pa3.attribute_id IN (4, 38)



Начать с таблицы product_to_attribute. Там более полумиллиона строчек.

1) отсеять из связочной таблицы product_to_attribute все товары, у которых нет атрибута 12 или 23. Строчек стало меньше
2) отсеять все товары, у которых нет атрибутов 2, или 37, или 42, или 54, или 1
3) отсеять все товары, у которых нет атрибутов 4 или 38.
.. и т.д.

Не заменяйте нна лефт джойн, это было неверно.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005229
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Разве такое не полностью эквивалентно одному in() с перечислением ВСЕХ идентов атрибутов? И оптимизатор не преобразует такой набор AND в один просмотр?

Подозреваю, что преобразует, т.к. на Ix86 наборе команд есть префикс повторения, с помощью которого поиск значения в списке (наборе) делается вовсе "одной командой" .. ну, по крайней мере, соблазн велик.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005232
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,
почти. Тут непонятно какая версия мускуля, перконы или марии в пользовании.
Ну и ещё вспомнилось (не знаю как сейчас), MyISAM имеет плохое масштабирование к количеству приджойненных табличек и особенно в режимах GROUP BY/HAVING .. я бы все же перешел на другой движок.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005236
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Начать с таблицы product_to_attribute. Там более полумиллиона строчек.

1) отсеять из связочной таблицы product_to_attribute все товары, у которых нет атрибута 12 или 23. Строчек стало меньше
2) отсеять все товары, у которых нет атрибутов 2, или 37, или 42, или 54, или 1
3) отсеять все товары, у которых нет атрибутов 4 или 38.
.. и т.д.
Подобные рассуждения сразу говорят о том, что есть опыт процедурного программирования, но нет понимания, как работает SQL-сервер "унутре". Привычка мыслить построчно обрабатываемым массивом, а не набором записей, обрабатываемым как единое целое.

"Отсекаем всё лишнее" - это и про SQL.

Если же попытаться серверу "помочь", заставив его хитровывернутыми конструкциями делать вот именно так - практически наверняка станет только хуже.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005237
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<dup - del>
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005257
para_bit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrow,

спасибо, буду разбираться.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005258
para_bit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109
Alex_Ustinov,
почти. Тут непонятно какая версия мускуля, перконы или марии в пользовании.
Ну и ещё вспомнилось (не знаю как сейчас), MyISAM имеет плохое масштабирование к количеству приджойненных табличек и особенно в режимах GROUP BY/HAVING .. я бы все же перешел на другой движок.


версия MySQL указана в первом сообщении 5.7.31.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005328
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
para_bit,

В таком разе, как понимаю innoDb и xtraDb несколько не одно и тоже.. но пусть меня поправят, если ошибся.
...
Рейтинг: 0 / 0
Несколько Join таблицы саму на себя
    #40005332
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там нет xtraDB
это конкурирующий движок
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Несколько Join таблицы саму на себя
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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