|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Добрый день, уважаемый форум. Прошу помощи в поиске решения: есть таблица вида ------------------------------------------ |id|name|category|option1|option2|option3|option4| ------------------------------------------ Задача стоит следующая(попытался упростить и выделить только суть): 1. Сделать группировку сначала по option1 2. Затем объединить результаты с группировкой по option2(при этом исключить записи, которые уже были сгруппированы по option1) 3. Затем объединить результаты группировки в п.1 и в п.2 с результатами группировки по option3(при этом исключить записи, которые уже были сгруппированы по option1 и option2) 4. Затем объединить результаты группировки в п.1, в п.2 и в п.3 с результатами группировки по option4 (при этом исключить записи, которые уже были сгруппированы по optio1, option2 и option3) 5. Вывести все оставшиеся, не сгруппированные записи. Сейчас делаю так: SELECT GROUP_CONCAT(id) as id_list from table WHERE option1 IS NOT NULL GROUP by option1,category HAVING COUNT(id) > 1 UNION SELECT GROUP_CONCAT(id) as id_list from table WHERE option2 IS NOT NULL GROUP by option2,category HAVING COUNT(id) > 1 UNION SELECT GROUP_CONCAT(id) as id_list from table WHERE option3 IS NOT NULL GROUP by option3,category HAVING COUNT(id) > 1 UNION SELECT GROUP_CONCAT(id) as id_list from table WHERE option4 IS NOT NULL GROUP by option4,category Запрос работает, но если например есть записи, которые могут быть сгруппированы как по option1 так и по option3, то они попадают в обе группировки, цель исключить записи из последующих объединений. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 02:10 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
tlq если например есть записи, которые могут быть сгруппированы как по option1 так и по option3 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 07:28 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Akina, спасибо за ответ, дело в том, что как правило у всех строк заполнены поля optionX, за редким исключением (~100-200 записей на миллион для каждого из полей optionX), т.е. условие "optionX IS NOT NULL" служит для того, чтобы просто исключить эти строки, с пустым параметром. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 07:58 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Цитирую: tlq есть записи, которые могут быть сгруппированы как по option1 так и по option3 Смотрю текст запроса, чтобы определить, какие записи "могут быть сгруппированы ... по option1": tlq Код: sql 1.
Нужно: tlq исключить записи из последующих объединений Поскольку они соответствуют показанному выше условию, исключить их можно только обратным условием Akina WHERE ... AND option1 IS NULL Что ещё??? речь идёт об исключении отдельных записей, а не о группированных агрегатах... Поясните лучше на примере. Создайте fiddle с примером наполнения, эталонным ответом, и пояснением, почему те или иные строки включены в ту или иную группу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 08:31 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Akina, спасибо большое за подсказку, нужно было бы сразу догадаться мне сделать fiddle: http://sqlfiddle.com/#!9/cee6e5/1 В fiddle вместо option_1, option_2, option_3, option_4 использую поля option_a, option_b, option_c и option_d соответственно, думаю так будет удобнее воспринять. Дело в том, что в базу автоматически добавляются данные со значением: имя, категория и значениями для полей option_a, option_b, option_c, option_d Нужно получить на выходе эти данные, только запчасти должны быть сгруппированы по этим полям(они являются идентификаторами), в порядке приоритета: 1. сначала сгруппировать всё что возможно по идентификатору option_a 2. затем по option_b(исключив все запчасти, уже сгруппированные по option_a, даже если option_b у них совпадает) 3. затем по option_c(также исключив запчасти, которые были уже сгруппированы по полям option_a или option_b, даже несмотря на то, что option_c может совпадать) 4. последняя надежда определить уникальность запчасти: группировка по option_d(исключив запчасти, которые уже возможно были сгруппированы по одному из полей выше) 5. также получить все оставшиеся (не сгруппированные ни по одному из полей) записи Эталонным ответом в данном fiddle будет результат вида: --------------------------------------------------------------------------------------------- | id_list | name | category | group_type | | 1,2 | Запчасть (поле А) | Станки | option_a | | 3,4,5 | Запчасть (поле B) | Станки | option_b | | 6,7,8 | Запчасть (поле C) | Станки | option_c | | 9,10 | Запчасть (поле D) | Станки | option_d | | 11 | Запчасть без группы №1 | Станки | option_d | | 12 | Запчасть без группы №2 | Станки | option_d | -------------------------------------------------------------------------------------------------------------- Тестовые данные с условной категорией "Автомобили" я не стал добавлять, чтобы не возникало путаницы, но при условии, что если будут точно такие же данные, но с другой категорией, они должны быть сгруппированы аналогично, учитывая сначала поле option_(a/b/c/d) затем category Кажется ничего не упустил. Заранее спасибо за ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 11:21 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Насколько я вижу из fiddle (пардон, перенёс сюда , sqlfiddle регулярно глючит), в первую группу должны попадать те записи, у которых option_a='a0000000' , dj вторую - не вошедшие в первую и имеющие option_b='b000001' , в третью - не вошедшие в первые две и имеющие option_c='c005500000' , в четвёртую - не вошедшие в первые три и имеющие option_d='d123000054' , и без группировки идут все, что не вошли в первые 4 группы. Сомневаюсь, что это верно - скорее всего, завязки на значения я определил неверно... нужны завязки на количество совпадающих значений без конкретных значений. Соответственно возникает вопрос - какая версия MySQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 11:46 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Akina Насколько я вижу из fiddle (пардон, перенёс сюда , sqlfiddle регулярно глючит), в первую группу должны попадать те записи, у которых option_a='a0000000' , dj вторую - не вошедшие в первую и имеющие option_b='b000001' , в третью - не вошедшие в первые две и имеющие option_c='c005500000' , в четвёртую - не вошедшие в первые три и имеющие option_d='d123000054' , и без группировки идут все, что не вошли в первые 4 группы. Сомневаюсь, что это верно - скорее всего, завязки на значения я определил неверно... нужны завязки на количество совпадающих значений без конкретных значений. Соответственно возникает вопрос - какая версия MySQL? Akina, в который раз благодарю за ответ, также спасибо за перенос на dbfiddle(к слову, не подозревал, что существует данный ресурс, sqlfiddle действительно пару раз давал мне ошибку, во время заполнения) Версия MySQL 8.0.17 Вы абсолютно верно помогли мне сформулировать эталонный результат, это именно то, что нужно на выходе, на примере данных из fiddle: авторв первую группу должны попадать те записи, у которых option_a='a0000000' , dj вторую - не вошедшие в первую и имеющие option_b='b000001' , в третью - не вошедшие в первые две и имеющие option_c='c005500000' , в четвёртую - не вошедшие в первые три и имеющие option_d='d123000054' , и без группировки идут все, что не вошли в первые 4 группы. Данные идентификаторы, которыми заполнены поля option_(a,b,c,d) могут иметь любое буквенно-цифровое значение произвольной длины, порой выглядящее достаточно хаотично, без определенных последовательностей и как правило это уникальные значения для данной запчасти(записи). Т.е. цель вернуть одинаковые запчасти(записи) по этим идентификаторам Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 12:10 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
tlq Версия MySQL 8.0.17 Так это же прекрасно! Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
Вот fiddle . Специально оставил шаги построения, чтобы была видна логика. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2020, 12:17 |
|
Объединение таблицы сгруппированной по нескольким полям
|
|||
---|---|---|---|
#18+
Akina, спасибо большое за помощь! Сутки ушли на различные тесты и перенос решения на реальные данные, всё отлично работает, спасибо также за сохранение всего пути построения запроса, это также очень и очень помогло, вопросов никаких не осталось, всё предельно ясно. Пожалуйста, подскажите, как я могу выразить вам благодарность в материальном выражении? Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2020, 05:52 |
|
|
start [/forum/topic.php?fid=47&msg=39921685&tid=1828759]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
99ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 515ms |
0 / 0 |