票证:
id_ticket |id_ticket_category |
----------|-------------------|
1 |8 |
2 |8 |
3 |13 |
类别:
id_category |id_parent |label |id_category_type |
------------|----------|----------------------------------|-----------------|
1 |-1 |Demande d'information |1 |
2 |-1 |Réclamation |1 |
3 |1 |Autre |2 |
4 |1 |Mairie |2 |
5 |1 |Stationnement |2 |
6 |2 |Autre |2 |
8 |3 |Autre |3 |
9 |4 |Réservation de salle |3 |
10 |4 |Autre |3 |
11 |5 |Horaires de stationnement |3 |
12 |5 |Autre |3 |
13 |6 |Autre |3 |
16 |7 |Autre |3 |
请注意,Ticket
表中的 id_ticket_category
列引用 Category
表中的 id_category
。
我想返回我有 id_ticket_category (id_category)
和 id_parentof 元素的计数和 concat
行。
示例:
对于 id_ticket_category = 8
,我查看 Category
表
id_category |id_parent |label |id_category_type |
------------|----------|----------------------------------|-----------------|
8 |3 |Autre |3 |
我看是 id_parent
不等于 -1
id_category |id_parent |label |id_category_type |
------------|----------|----------------------------------|-----------------|
3 |1 |Autre |2 |
我看是 id_parent 不等于 -1
id_category |id_parent |label |id_category_type |
------------|----------|----------------------------------|-----------------|
1 |-1 |Demande d'information |1 |
id_parent
等于 -1
我打印我的结果
Category |count|
-------------------------|-----|
Autre-Demande Information| 2 |
其实我有这个要求:
SELECT CONCAT(c.label, '-', parents.label), c.id_parent
FROM Category c INNER JOIN
(SELECT id_category AS id, label FROM category c WHERE id_parent = -1) AS parents
ON parents.id = c.id_parent
WHERE c.id_category_type < 3
ORDER BY c.id_category_type;
那么有人知道如何改进吗?
最佳答案
似乎您需要按类别对工单进行分组并显示计数和路径。如果类别树的最大深度为 3 级,则此方法有效:
SELECT
id_ticket_category,
CONCAT_WS(' > ', c3.label, c2.label, c1.label) AS `category`,
COUNT(*) AS `count`
FROM ticket
LEFT JOIN category c1 ON ticket.id_ticket_category = c1.id_category
LEFT JOIN category c2 ON c1.id_parent = c2.id_category
LEFT JOIN category c3 ON c2.id_parent = c3.id_category
GROUP BY id_ticket_category, category
输出:
+--------------------+---------------------------------------+-------+
| id_ticket_category | category | count |
+--------------------+---------------------------------------+-------+
| 8 | Demande d'information > Autre > Autre | 2 |
| 13 | Réclamation > Autre > Autre | 1 |
+--------------------+---------------------------------------+-------+
转换为嵌套集模型
nested set model在检索分层数据时效率更高。但是,维护它可能很困难。如果您有兴趣,那么您首先需要将您的数据转换成这样:
+-------------+-----------+---------------------------+------------------+------+------+
| id_category | id_parent | label | id_category_type | l | r |
+-------------+-----------+---------------------------+------------------+------+------+
| 1 | -1 | Demande d'information | 1 | 2 | 19 |
| 2 | -1 | Réclamation | 1 | 20 | 25 |
| 3 | 1 | Autre | 2 | 3 | 6 |
| 4 | 1 | Mairie | 2 | 7 | 12 |
| 5 | 1 | Stationnement | 2 | 13 | 18 |
| 6 | 2 | Autre | 2 | 21 | 24 |
| 8 | 3 | Autre | 3 | 4 | 5 |
| 9 | 4 | Réservation de salle | 3 | 8 | 9 |
| 10 | 4 | Autre | 3 | 10 | 11 |
| 11 | 5 | Horaires de stationnement | 3 | 14 | 15 |
| 12 | 5 | Autre | 3 | 16 | 17 |
| 13 | 6 | Autre | 3 | 22 | 23 |
| 16 | 7 | Autre | NULL | NULL | NULL |
+-------------+-----------+---------------------------+------------------+------+------+
然后你可以使用这个查询(它对类别树的深度没有限制):
SELECT
id_ticket_category,
GROUP_CONCAT(DISTINCT CONCAT(parent.label, ' (', parent.id_category, ')') ORDER BY parent.l SEPARATOR ' > ') AS category,
COUNT(DISTINCT id_ticket) AS `count`
FROM ticket
LEFT JOIN category ON ticket.id_ticket_category = category.id_category
LEFT JOIN category parent ON category.l BETWEEN parent.l AND parent.r
GROUP BY id_ticket_category
输出:
+--------------------+---------------------------------------------------+-------+
| id_ticket_category | category | count |
+--------------------+---------------------------------------------------+-------+
| 8 | Demande d'information (1) > Autre (3) > Autre (8) | 2 |
| 13 | Réclamation (2) > Autre (6) > Autre (13) | 1 |
+--------------------+---------------------------------------------------+-------+
关于mysql - 连接多行分层数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47944054/