按列2排序,按列1分组

时间:2014-08-21 06:07:59

标签: sql parent-child mariadb

标题可能不够清晰,但并不知道更好的说法。

问题在于我有一张名为Partij的表格,其中包含idPartijMoederpartij。列Moederpartij将指向idPartij(因此我们可以创建Mother -> Child关系。)

这是我到目前为止的查询:

SELECT 
       P.idPartij,
       P.Partijnaam,
       P.Gewicht,
       PER.Perceel,
       P.Moederpartij
FROM Partij AS P
LEFT OUTER JOIN Perceel AS PER ON P.idPerceel = PER.idPerceel
WHERE P.Actief = 1
ORDER BY 
       P.Moederpartij ASC,
       P.Partijnaam ASC

这导致以下输出:

360 | 34 Avarna 13-1V     |  |  0
280 | 36 Agata 13-1V      |  |  0
160 | 37 Excellency 13-1V |  |  0
140 | 38 Erika 13-1V      |  |  0
300 | 39 Rosagold 13-1V   |  |  0
240 | 40 Fontane 13-2V    |  |  0
200 | 41 Fontane 13-1V    |  |  0
220 | 42 Fontane 13-3V    |  |  0
180 | 45 Spunta 13-3V     |  |  0
260 | 46 Arnova 13-1V     |  |  0
400 | 43 Spunta 13-2V     |  |  180
380 | 44 Spunta 13-1V     |  |  180
320 | 35 Altus 13-1V      |  |  260
340 | 47 Arizona 13-1V    |  |  260

但我试图获得以下输出:

360 | 34 Avarna 13-1V     |  |  0
280 | 36 Agata 13-1V      |  |  0
160 | 37 Excellency 13-1V |  |  0
140 | 38 Erika 13-1V      |  |  0
300 | 39 Rosagold 13-1V   |  |  0
240 | 40 Fontane 13-2V    |  |  0
200 | 41 Fontane 13-1V    |  |  0
220 | 42 Fontane 13-3V    |  |  0
180 | 45 Spunta 13-3V     |  |  0
400 | 43 Spunta 13-2V     |  |  180
380 | 44 Spunta 13-1V     |  |  180
260 | 46 Arnova 13-1V     |  |  0
320 | 35 Altus 13-1V      |  |  260
340 | 47 Arizona 13-1V    |  |  260

这样你首先得到Mother (Moederpartij)然后得到所有Childs,依此类推......

这在单个查询中是否可行,或者我应该通过记录在PHP中循环获取每条记录的所有子项吗?

编辑1 正在运行的数据库是MariaDB

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解你的问题,但是#34; Avarna 13-1V"例如,完整的聚会名称和你称之为的母亲是#34; Avarna"?

即。你想要所有的Spuntas,Fontanes等,但它们也包含13-1V,13-2V等等,这是什么抛出它?

您可以先按照第一个单词排序(找到空格分隔符,然后单击左侧),然后按照主方字段排序。例如。像这样的东西:

左命令(Partijnaam,LOCATE('',Partijnaam) - 1),Moederpartij

但是,如果是这样的话,为什么不将文本名称和13-v1等分成不同的列呢?

(MySQL的)

答案 1 :(得分:1)

试试这个。我在select查询中添加了一列,并根据它进行了排序。由于我没有MariaDB没有测试过查询,但我确信它会解析你的查询。

SELECT 
       P.idPartij,
       P.Partijnaam,
       P.Gewicht,
       PER.Perceel,
       P.Moederpartij,
       case when P.Moederpartij =0 then
       Concat(P.idPartij ,"-", "0","-", P.idPartij )
       else
       Concat(P.Moederpartij ,"-", "9","-", P.idPartij )
       end sorder
FROM Partij AS P
LEFT OUTER JOIN Perceel AS PER ON P.idPerceel = PER.idPerceel
WHERE P.Actief = 1
ORDER BY 
       sorder Asc