MySQL - GROUP_CONCAT устраняет дубликаты при объединении нескольких таблиц - PullRequest
0 голосов
/ 04 августа 2020

SQLFiddle здесь

Проблема:

Поскольку я объединяю две таблицы - prices и videos, GROUP_CONCAT() дублирует значения для каждой строки, к которой присоединяется вторая LEFT JOIN.

Моя попытка:

SELECT
    `Cat`.*,
    GROUP_CONCAT(COALESCE(`Price`.`id`, "") ORDER BY `Price`.`price`) AS `PriceId`,
    GROUP_CONCAT(COALESCE(`Price`.`price`, "") ORDER BY `Price`.`price`) AS `PricePrice`,
    GROUP_CONCAT(COALESCE(`Vid`.`id`, "") ORDER BY `Vid`.`id`) AS `VideoId`,
    GROUP_CONCAT(COALESCE(`Vid`.`uuid`, "") ORDER BY `Vid`.`id`) AS `VideoUUID`
FROM
    `categories` AS `Cat`
LEFT JOIN `prices` AS `Price` ON `Cat`.`id`=`Price`.`category_id`
LEFT JOIN `videos` AS `Vid` ON `Cat`.`id`=`Vid`.`category_id`
GROUP BY
    `Cat`.`id`

Вопрос:

Как настроить запрос, чтобы столбцы PricePrice, VideoId, VideoUUID в выводе SQLFiddle не содержали дубликатов?

Я пытался добавить DISTINCT внутри GROUP_CONCAT, но это не помогает, так как он отфильтрует повторяющиеся значения, которые я должен сохранить (например, price)

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Иногда нужно просто согласиться с тем, что не каждую проблему следует решать одним запросом. В этом случае вы можете избежать декартова произведения между двумя соединенными таблицами, выполнив два отдельных запроса:

SELECT
    `Cat`.*,
    GROUP_CONCAT(COALESCE(`Price`.`id`, "") ORDER BY `Price`.`price`) AS `PriceId`,
    GROUP_CONCAT(COALESCE(`Price`.`price`, "") ORDER BY `Price`.`price`) AS `PricePrice`,
FROM
    `categories` AS `Cat`
LEFT JOIN `prices` AS `Price` ON `Cat`.`id`=`Price`.`category_id`
GROUP BY
    `Cat`.`id`;

SELECT
    `Cat`.*,
    GROUP_CONCAT(COALESCE(`Vid`.`id`, "") ORDER BY `Vid`.`id`) AS `VideoId`,
    GROUP_CONCAT(COALESCE(`Vid`.`uuid`, "") ORDER BY `Vid`.`id`) AS `VideoUUID`
FROM
    `categories` AS `Cat`
LEFT JOIN `videos` AS `Vid` ON `Cat`.`id`=`Vid`.`category_id`
GROUP BY
    `Cat`.`id`;
1 голос
/ 04 августа 2020

Вместо объединения трех таблиц хорошее решение - использовать скалярные подзапросы . Например:

select
  *,
  (select group_concat(p.id order by p.price) 
   from prices p where p.category_id = c.id) as PriceId,
  (select group_concat(p.price order by p.price) 
   from prices p where p.category_id = c.id) as PricePrice,
  (select group_concat(v.id order by v.id) 
   from videos v where v.category_id = c.id) as VideoId,
  (select group_concat(v.uuid order by v.id) 
   from videos v where v.category_id = c.id) as VideoUUID
from categories c
group by id

Результат:

id  token                PriceId     PricePrice           VideoId      VideoUUID                           
--- -------------------- ----------- -------------------- ------------ ----------------------------------- 
1   Wyatt Reinger (ZW)   2,1,3       2.51,2.61,4.45       1,2,3,4      3a817d01,3222679e,63cdc038,e8d8edf4 
2   Donna Cronin (BL)    4           4.76                 5            93f8a404                            
3   Ally Kertzmann (GY)  5,6         1.83,1.84            6,7,8        6f2459a7,463127ab,4bf357ba          
4   Talia Torp (AF)      7,8         2.61,3.32            9,10,11,12   0cedbd0a,8b21afd7,ea616692,ed2b10d7 
5   Delphine Lakin (TL)  11,12,9,10  1.65,3.27,3.27,3.36  13,14,15,16  6217a488,7f52a97a,de11ba64,b49b6ddc 

См. Рабочий пример на SQL Fiddle .

Проблема объединения трех таблиц в том, что он производит много повторяющихся значений, которые усложняют агрегирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...