|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Прошу помощи. Есть таблица с товарами и аналогами (ряду товаров прописан один и тот же аналог) вида: product | product_analog a | x b | x c | x Необходимо вывести все возможные варианты "товар-аналог", то есть привести её к следующему виду: product | product_analog a | x a | b a | c b | x b | a b | c c | x c | a c | b x | a x | b x | c ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 11:11 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
a.m.bal, Для начала надо всё нормализовать, следовательно нужно две таблицы - product и product_analog (id_product, id_analog) В таком случае запрос будет сделать легко и просто как-то так: Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 11:46 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
crutchmaster, Есть как раз две таблицы: product (id, наименование и т.д.) и product_analog (соответствие товара и аналога по id). Правильно ли я понял, что в предложенном скрипте под a и b принимать таблицу product , а под pa - product_analog ? Если правильно, то получаются некорректные, в виде: product | product_analog a | a a | a a | a b | b b | b b | b c | c c | c c | c ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 12:22 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6.
fiddle ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 14:02 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Akina, На WITH ругается (Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ...) Опишу задачу подробнее. Есть таблица с соответствием "Товар-аналог" в виде: product | product_analog a | x b | x Необходимо, пользуясь условием, что если a=x и b=x , то и a=b , привести таблицу к виду: product | product_analog a | x a | b b | x b | a x | a x | b (другими словами, необходимо вывести все возможные сочетания аналогов) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 15:08 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
a.m.bal На WITH ругается a.m.bal Необходимо, пользуясь условием, что если a=x и b=x , то и a=b , привести таблицу к виду Приплыли... это ещё более гадостная задача. И на Вашей версии она запросом не решается в принципе - только в формате хранимой процедуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 19:24 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
a.m.bal если a=x и b=x , то и a=b ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2020, 19:48 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
a.m.bal, Да, надо было 4 связи. Код: sql 1. 2. 3. 4.
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=94452249357de8b626841f4956d097ff Писал так - сделал 4 связи, а потом отсекал лишнее поэтапно. Логика происходящего целиком так в голову и не влезла, но вроде работает, да и запрос благой. Код: sql 1.
Тут прямая и обратная связи - продукт - аналог, аналог продукт. Код: sql 1. 2.
Первое условие обеспечивает a->x x->a Второе условие обеспечивает a->x->b и b->x->a, если я ничего не путаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 05:28 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
crutchmaster но вроде работает ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 07:31 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
fiddle ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 07:43 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Akina, Поменял. a_idb_idabbaxbxabxaxcbbc Что не так? с->b->x->a нету? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:31 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Akina, Всё, понял. Еще раз убедился, что херня этот ваш sql. Почти любую задачу проще решить императивно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 11:50 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
crutchmaster Еще раз убедился, что херня этот ваш sql. А на старом дерьме за что не возьмись - всё херня. Или это "всё, что я не знаю - всё херня"? Кстати, а как насчёт просто версию обновить до актуальной? crutchmaster Почти любую задачу проще решить императивно. Вот будет у тебя массив данных в пару терабайт - тогда я и посмотрю, как ты его потащишь в клиента для императивного решения... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 13:26 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
crutchmaster Всё, понял. Еще раз убедился, что херня этот ваш sql. Почти любую задачу проще решить императивно. Что касается императивных подходов, то это смешно - например, запчастей и аналогов может быть десятки миллионов строк, а результат должен формироваться за 1 секунду. Впрочем, те, кто сидят на фронтэнде и гоняют "императивно" 10 несчастных записей по массивам на клиенте, вряд ли когда-нибудь это осознают. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2020, 17:16 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Akina А на старом дерьме за что не возьмись - всё херня. Или это "всё, что я не знаю - всё херня"? Подсказка. Твоё решение - императивное. Я пытался наваять как нужно и мог бы что-то там выпрыгнуть с рекурсивными запросами, но увидел цикл со вставкой и тупо опустились руки. Akina Вот будет у тебя массив данных в пару терабайт Вот когда будет, тогда и поговорим. А по факту, в подавляющем большинстве случаев, ничего такого нет и всё влазит в ram целиком несколько раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 10:20 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
Gluck99 Что касается императивных подходов, то это смешно - например, запчастей и аналогов может быть десятки миллионов строк, а результат должен формироваться за 1 секунду. Но он в любом случае не будет формироваться за 1 секунду на огромном массиве данных, в этом нет смысла хоть с sql хоть без. Такое считают заранее и складывают и на какой хер писать невменяемую sql портянку, если можно вытащить данные и написать понятный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 10:23 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
crutchmaster Твоё решение - императивное. Я пытался наваять как нужно и мог бы что-то там выпрыгнуть с рекурсивными запросами, но увидел цикл со вставкой и тупо опустились руки. Не очень понимаю на самом деле, какой в данном случае вкладывается смысл в термин "императивный". Если это попытка провести параллель с процедурой на языке высокого уровня, который мусолит массив по одному элементу - то термин применён явно не по делу. Цикл со вставкой - это именно то, что находится под капотом рекурсивного CTE - у любого сервера. С той лишь разницей, что в моём коде условие окончания формируется ограничением уникального индекса (тогда как на СУБД, которая не поддерживает UNION DISTINCT в рекурсивном CTE, с окончанием рекурсии придётся солидно потрахаться). Другой вопрос, что хранимая процедура выполняется режиме интерпретации, тогда как рекурсивный CTE использует оптимизированные процедуры с повторным использованием плана выполнения. Что же до опускания рук - ну сочувствую, чо... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 12:11 |
|
Необходимо выбрать все возможные пары из таблицы
|
|||
---|---|---|---|
#18+
crutchmaster на какой хер писать невменяемую sql портянку, если можно вытащить данные и написать понятный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2020, 12:13 |
|
|
start [/forum/topic.php?fid=47&msg=40001669&tid=1828376]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
130ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 240ms |
0 / 0 |