Php 如何按两列对MySQL查询进行排序

Php 如何按两列对MySQL查询进行排序,php,mysql,Php,Mysql,下面是我的DB数据,如何使用php/mysql按sid和prev_sid对其进行排序 sid prev_sid type 000 197 app_home 197 198 page_teach 198 218 page_teach 199 211 page_step 211 207 link 218 559 page_step 559 199

下面是我的DB数据,如何使用php/mysql按sid和prev_sid对其进行排序

sid prev_sid    type
000 197         app_home    
197 198         page_teach  
198 218         page_teach  
199 211         page_step   
211 207         link        
218 559         page_step   
559 199         page_step
结果:

sid prev_sid    type
000 197         app_home
197 198         page_teach
198 218         page_teach
218 559         page_step
559 199         page_step
199 211         page_step
211 207         link

000-->197-->198-->218-->559-->199-->199-->211-->207我建议您重新考虑表格设计。这种类型的数据表示方式使行无法方便高效地排序

如果您需要保持当前的表设计,我怀疑您将需要涉及SQL变量,并且排序选择变得非常混乱,可能没有效率


另一个可能更好的解决方案是在应用程序端进行排序,此时可以使用哈希映射轻松地在线性时间内完成排序,将sid值映射到prev_sid和类型值对。

我建议您重新考虑表的设计。这种类型的数据表示方式使行无法方便高效地排序

如果您需要保持当前的表设计,我怀疑您将需要涉及SQL变量,并且排序选择变得非常混乱,可能没有效率


另一个可能更好的解决方案是在应用程序端进行排序,此时可以使用哈希映射轻松地在线性时间内完成排序,将sid值映射到prev_sid和type值对。

如果仔细查看数据,就会发现只需按
sid
排序即可。这是在SQL中通过在查询中附加
orderbysid
来完成的

SELECT sid, prev_sid, type FROM table ORDER BY sid
如果需要对两列进行排序(此处不是这种情况,但可能很有用),
orderby
可以将列列表作为参数

SELECT sid, prev_sid, type FROM table ORDER BY sid, prev_sid

如果仔细查看数据,您将发现只需按
sid
排序即可。这是在SQL中通过在查询中附加
orderbysid
来完成的

SELECT sid, prev_sid, type FROM table ORDER BY sid
如果需要对两列进行排序(此处不是这种情况,但可能很有用),
orderby
可以将列列表作为参数

SELECT sid, prev_sid, type FROM table ORDER BY sid, prev_sid
218>559>199

没有使用任何我用过的编号系统不是。我认为你没有很好地解释你的问题

查看该示例,我怀疑您希望根据sid的值或perv_sid的值进行排序,这取决于哪个值较小,因此:

按最少顺序排列(sid,上一个sid)

C

218>559>199

没有使用任何我用过的编号系统不是。我认为你没有很好地解释你的问题

查看该示例,我怀疑您希望根据sid的值或perv_sid的值进行排序,这取决于哪个值较小,因此:

按最少顺序排列(sid,上一个sid)


C.

看起来您的数据是一个邻接列表(即sed和prev_sid定义了递归父子关系)。如果是这种情况,那么要使项目按顺序排列,可以将其转换为嵌套集,并按每个节点的左值排序,以使项目按顺序排列。有关分层数据的更多信息,请参阅


顺便说一句,如果您想使用PHP将邻接列表转换为嵌套集,请查看我的答案。

看起来您的数据是一个邻接列表(即sed和prev_sid定义递归父子关系)。如果是这种情况,那么要使项目按顺序排列,可以将其转换为嵌套集,并按每个节点的左值排序,以使项目按顺序排列。有关分层数据的更多信息,请参阅


顺便说一句,如果您想使用PHP将邻接列表转换为嵌套集,请查看我的答案。

否,如果您仔细查看OPs示例输出,您会注意到sid:559应该位于sid:199之前。(S) 他需要一个顺序,其中每行的sid等于前一行的上一个sid。不,如果仔细查看OPs示例输出,您会注意到sid:559应该位于sid:199之前。(S) 他希望排序时,每行的sid等于前一行的上一个sid。如其他注释中所述:他希望排序时,每行的sid等于前一行的上一个sid。您不应将“>”解释为数字“大于”。您可以使用2000+rep将其更改为“->”(或其他内容)来澄清这一点。如其他注释中所述:他需要一个顺序,其中每行的sid等于前一行的上一个sid。您不应将“>”解释为数字“大于”。您可以使用2000+rep将其更改为“->”(或其他内容)来澄清这一点。您所说的“按每个节点的左值排序”是什么意思?如果您花时间查看我提供的有关分层数据的链接,并滚动到嵌套集的描述,您将看到它是什么。节点是树中的一条记录。您所说的“按每个节点的左值排序”是什么意思?如果您花时间查看我提供的有关层次数据的链接,并滚动到嵌套集的描述,您将看到它是什么。节点是树中的记录。