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