CONCAT в пределах GROUP_CONCAT - как удалить дублирующийся результат - PullRequest
0 голосов
/ 03 ноября 2018

CONCAT в пределах GROUP_CONCAT, что не так с последующим кодом MySQL? Пожалуйста, смотрите SQL Fiddle, полный код там.

Позвольте мне объяснить, у меня есть 5 таблиц

cls - Список классов

сек - список секций

комиссия - Перечень комиссий

cls_sec - Список разделов, назначенных каждому классу

cls_fee - Список сборов, назначенных для каждого раздела

Таблица cls - списки класса

id  |   ttl
===========
1   |   One
2   |   Two
3   |   Three

Таблица sec - списки разделов

id  |   ttl
===========
1   |   A
2   |   B

Таблица cls_sec - списки каждого раздела, отнесенного к классу

id  |   c_id|   s_id    
=====================
1   |   1   |   1
2   |   1   |   2
3   |   2   |   1

Таблица fee - списки категорий оплаты

id  |   ttl
===========
1   |   Annual
2   |   Monthly
3   |   Library

Таблица cls_fee - списки каждого сбора и суммы, назначенной для класса

id  |   c_id|   s_id|   f_id|   fee 
=====================================
1   |   1   |   1   |   1   |    2000
2   |   1   |   1   |   2   |    500
3   |   1   |   2   |   1   |    3000
4   |   1   |   2   |   2   |    400
5   |   2   |   1   |   1   |    4500
6   |   2   |   1   |   2   |    450
7   |   3   |   0   |   1   |    5000
8   |   3   |   0   |   2   |    600
9   |   3   |   0   |   3   |    300

Здесь я пытаюсь включить все отношения в один GROUP_CONCAT Результат

Мой текущий вывод (Имя класса и имя раздела выбирается многократно в соответствии с платой)

//Class Name - Section Name (if exist) - fee, Class Name - Section Name (if exist) - fee ..

3.Three.Library->300, 3.Three.Monthly->600, 3.Three.Annual->5000, 
2.Two-A.Monthly->450, 2.Two-A.Annual->4500, 1.One-A.Monthly->500, 
1.One-A.Annual->2000, 1.One-B.Monthly->400, 1.One-B.Annual->3000

со следующим кодом

  GROUP_CONCAT(DISTINCT CONCAT('\r\n',cls.id,'.',cls.ttl,
       COALESCE(CONCAT('-',sec.ttl),''),COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))) 
       ORDER BY sec.id) AS cls  

Но что я хочу (удалить класс и раздел дублирования)

//Class Name - Section Name (if exists) - fee, fee

3.Three.Library->300,Monthly->600,Annual->5000, 
2.Two-A.Monthly->450,Annual->4500, 
1.One-A.Monthly->500,Annual->2000,
1.One-B.Monthly->400,Annual->3000

Поэтому я добавляю CONCAT во вложенные CONCAT

  GROUP_CONCAT(DISTINCT CONCAT('\r\n',cls.id,'.',cls.ttl,
      COALESCE(CONCAT('-',sec.ttl,COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))), '')) 
      ORDER BY sec.id) AS cls

и получил вывод, но он не получился, как ожидалось, также не хватает платы

3.Three,
2.Two-A.Monthly->450, 2.Two-A.Annual->4500, 
1.One-A.Monthly->500, 1.One-A.Annual->2000, 
1.One-B.Monthly->400, 1.One-B.Annual->3000

MySQL CODE

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('\r\n',cls.id,'.',cls.ttl,
      COALESCE(CONCAT('-',sec.ttl),''),COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))) 
      ORDER BY sec.id) AS cls
FROM
  cls
LEFT JOIN
  cls_sec ON cls_sec.cls = cls.id
LEFT JOIN
  sec ON sec.id = cls_sec.sec
LEFT JOIN
  cls_fee ON cls_fee.c_id = cls.id
LEFT JOIN
  fee ON fee.id = cls_fee.f_id
WHERE
  CASE WHEN cls_fee.s_id != 0 THEN cls_fee.s_id = sec.id ELSE cls.id END

SQL Fiddle

1 Ответ

0 голосов
/ 03 ноября 2018

Вы можете попытаться использовать подзапрос для записи GROUP_CONCAT из подробностей на cls.id, cls.ttl, а затем снова выполните GROUP_CONCAT в основном запросе.

Запрос 1 :

SELECT GROUP_CONCAT(CONCAT(Id,'.',ttl,'.',flag,cls)  ORDER BY Id desc,flag) result
FROM (
  SELECT
     cls.id,
     cls.ttl,
     COALESCE(CONCAT('-',sec.ttl),'') flag,
     GROUP_CONCAT(DISTINCT CONCAT(
                COALESCE(CONCAT('.',fee.ttl,'->',cls_fee.fee))) 
                ORDER BY sec.id) AS cls
  FROM
    cls
  LEFT JOIN
    cls_sec ON cls_sec.cls = cls.id
  LEFT JOIN
    sec ON sec.id = cls_sec.sec
  LEFT JOIN
    cls_fee ON cls_fee.c_id = cls.id
  LEFT JOIN
    fee ON fee.id = cls_fee.f_id
  WHERE
    CASE WHEN cls_fee.s_id != 0 THEN cls_fee.s_id = sec.id ELSE cls.id END
  GROUP BY 
     cls.id,
     cls.ttl,
     COALESCE(CONCAT('-',sec.ttl),'')
)t1

Результаты :

|                                                                                                                                                        result |
|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 3.Three..Library->300,.Monthly->600,.Annual->5000,2.Two.-A.Monthly->450,.Annual->4500,1.One.-A.Monthly->500,.Annual->2000,1.One.-B.Monthly->400,.Annual->3000 |
...