MySql僵局-无法前进

MySql僵局-无法前进,mysql,Mysql,我现在有一个我写的sql语句,它可以工作,但它不是我想要的。我已经做了几个小时了,但似乎再也做不下去了 选择parent.id作为parent\u id,parent.subject作为parent,s.id,s.subject从subjects s中选择s.id,s.subject,其中parent\u id=0 parent在parent.id=s.parent\u id上加入subjects按parent.subject,s.subject排序 它抓取所有主题并正确排序,但我还希望在每个分

我现在有一个我写的sql语句,它可以工作,但它不是我想要的。我已经做了几个小时了,但似乎再也做不下去了

选择parent.id作为parent\u id,parent.subject作为parent,s.id,s.subject从subjects s中选择s.id,s.subject,其中parent\u id=0 parent在parent.id=s.parent\u id上加入subjects按parent.subject,s.subject排序

它抓取所有主题并正确排序,但我还希望在每个分组的顶部返回父主题parent_id=0。这是因为有些家长可能没有主题,但我仍然需要返回它们。此外,当我尝试按照我希望的方式进行排序时,排序是关闭的,首先是父对象,然后是子对象。希望这是有道理的,但如果不是这样的话,就去问吧

任何帮助都将不胜感激

谢谢


Steve

您所说的是按父行对行集进行分组

我知道如何在MySQL中实现这一点的唯一方法是使用GROUP_CONCAT函数,它不会按行对主题进行分组,而是创建一个分组字符串

以下是您可以做的:

SELECT
    a.id,
    a.subject,
    GROUP_CONCAT(CONCAT(b.id, ':::', b.subject) ORDER BY b.subject SEPARATOR '|||') AS subjectlist
FROM
    subjects a
LEFT JOIN
    subjects b ON a.id = b.parent_id
WHERE
    a.parent_id = 0
GROUP BY
    a.id,
    a.subject
ORDER BY 
    a.subject
因此,这将为您提供如下结果集:

id            |     subject     |     subjectlist
---------------------------------------------------------------------
2             |     subj1       |     23:::childsubj1|||28:::childsubj4
3             |     subj2       |     18:::childsubj8|||55:::childsubj16
4             |     subj3       |     NULL
根据您在应用程序中使用的语言,您可以将主题字符串分解为数组,首先用分隔每个主题的| | |分隔,然后:::分隔该主题的ID和名称

显然,这样做的缺点是您必须确保您的子主题名称不包含| | | |或:::或您决定使用的任何分隔符

编辑:实验性地,我提出了这个替代解决方案,它可能更接近您所寻找的:

尝试:

此查询应提供以下结果:

subject                                 |       id       |
----------------------------------------------------------
subj1                                   |       2        |
---> childsubj1                         |       23       |
---> childsubj4                         |       28       |
subj2                                   |       3        |
---> childsubj8                         |       18       |
---> childsubj16                        |       55       |
subj3                                   |       4        |
subj4                                   |       5        |
---> childsubj10                        |       79       |

你能给出一些示例数据并展示你想要的结果吗?非常感谢zane。很好用!伟大的但事实上,我有一个想法,我目前正在充实,可能更接近你想要的,所以请继续关注编辑。。。也许在接下来的10分钟左右!实验替代方案张贴。让我知道它是如何工作的。。。我很好奇。谢谢你修改后的解决方案Zane。效果很好,可以避免爆炸结果。非常感谢!
subject                                 |       id       |
----------------------------------------------------------
subj1                                   |       2        |
---> childsubj1                         |       23       |
---> childsubj4                         |       28       |
subj2                                   |       3        |
---> childsubj8                         |       18       |
---> childsubj16                        |       55       |
subj3                                   |       4        |
subj4                                   |       5        |
---> childsubj10                        |       79       |