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