Sql 按第2列排序,按第1列分组
也许标题不够清楚,但不知道更好的表达方式 问题是我有一个名为Sql 按第2列排序,按第1列分组,sql,parent-child,mariadb,Sql,Parent Child,Mariadb,也许标题不够清楚,但不知道更好的表达方式 问题是我有一个名为Partij的表,它有一个idPartij和一个Moederpartij。列Moederpartij将指向idPartij(因此我们可以创建一个母亲->子女关系) 这是我到目前为止提出的问题: SELECT P.idPartij, P.Partijnaam, P.Gewicht, PER.Perceel, P.Moederpartij FROM Partij AS
Partij
的表,它有一个idPartij
和一个Moederpartij
。列Moederpartij
将指向idPartij
(因此我们可以创建一个母亲->子女关系)
这是我到目前为止提出的问题:
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
但我试图获得以下输出:
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
所以你首先得到母亲(Moederpartij)
,然后是所有的孩子,依此类推
这在一个查询中是可能的,还是我应该在PHP中循环遍历记录并获取每个记录的所有子项
编辑1
运行此操作的数据库是一个
MariaDB
我不确定我是否理解你的问题,但是“Avarna 13-1V”是比如派对的全名,而你称之为“Avarna”的母亲吗
也就是说,你想要所有的喷泉、方丹等都放在一起,但它们也包含13-1V、13-2V等,这就是它的缺点
您可以先按第一个单词排序(找到空格分隔符并在其左边),然后按“母亲参与方”字段排序。例如,类似这样的事情:
按左排序(Partijnaam,LOCATE(“”,Partijnaam)-1),Moederpartij
但是如果是这样的话,为什么不把文本名和13-v1等分成不同的列呢
(MySQL)试试这个。我在select查询中添加了一列,并根据它进行排序。因为我没有测试程序,所以我没有测试这个查询,但我确信它可以解决您的查询
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
您想在哪个数据库中实现Oracle/SQL Server/MySQL?@Aravintkhanna,它是一个
MariaDB
服务器。很抱歉没有指出这一点!关于党的名称,你说得对。大多数时候他们需要在一起,但是。。。他们并不总是紧密地联系在一起。这就是为什么我使用< <代码>母版< /代码>关系>代码> ID …这是更多的工作,但是如果你将长期使用这些数据,你可以考虑把母亲和孩子们分解成他们自己的独立表,然后把它们与外键联系起来。然后,您可以连接表&对数据做更多的处理,而不必担心字符串操作。您现在在两列之间将它们链接在一起的方式更像是一个链表,就像每个表都有一个特定的后继表一样。你真的只是想要分组,听起来像。按照order by操作字符串将有助于实现这一点,但以关系方式定义这些关系始终是最佳实践。这确实是更好的处理方法,我已经考虑过了,并在这里与其他开发人员讨论过。但这将是一个很大的工作,因为这个表也用于许多其他产品。所以我希望有一种“干净”的SQL方式,在我在PHP脚本中使用它之前……数据量是什么样的?如果有很多记录,那么PHP方法可能效率低下&在PHP服务器上很难实现。我刚才想到的另一个选择是,可以在ID上的表上向母亲写入一个自联接,然后提取Partijnaam字符串中左两个整数的MIN,并对该字段进行排序。不管怎样,我认为你最好的选择是字符串操作操作符!这确实是我要找的地方!它是开箱即用的。非常感谢你!