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

时间:2010-05-06 09:40:15

标签: php mysql

以下是我的数据库数据,如何用sid和prev_sid用php / mysql对它进行排序??

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

4 个答案:

答案 0 :(得分:2)

我建议你重新考虑你的桌面设计。这种类型的数据表示可以方便有效地对行进行排序。

如果你需要保留当前的表设计,我怀疑你需要涉及SQL变量,并且排序选择变得非常混乱并且可能效率不高。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

SELECT sid, prev_sid, type FROM table ORDER BY sid

如果您需要对两列进行排序(这里不是这种情况,但可能有用),ORDER BY可以将列列表作为参数。

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

答案 3 :(得分:-2)

  

218> 559> 199

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

查看示例我怀疑您要根据sid的值或perv_sid的值进行排序,具体取决于哪个较小,所以:

至少订购(sid,prev_sid)

下进行。