2010-05-06 243 views
2

以下是我的DB数据,如何通过sid和prev_sid对php/mysql进行排序!?如何按两列对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

回答

2

我建议你重新考虑你的餐桌设计。这种类型的数据表示可以防止行被方便而有效地排序。

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

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

-1

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

SELECT sid, prev_sid, type FROM table ORDER BY sid 

如果需要排序的两列(这是不是这里的情况,但它可能是有用的),ORDER BY可以作为参数列的列表。

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

不,如果仔细观察OP的示例输出,您会注意到sid:559应该在sid:199之前。 (S)他希望排序,每行的sid等于前一行的prev_sid。 – aioobe 2010-05-06 10:43:33

+0

哦!我的错误... – 2010-05-06 20:40:58

-2

218> 559> 199

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

看着你想基于无论是对SID值或perv_sid价值,取决于它是较小的排序,我怀疑的例子,所以:

ORDER BY LEAST(SID,prev_sid)

C.

+0

正如其他评论中提到的那样:他想要一个排序,其中每行的sid等于前一行的prev_sid。您不应将“>”解释为数字“大于”。你有2000+的代表可能会把它改成“ - >”(或其他)来澄清这一点。 – aioobe 2010-05-06 12:29:13

0

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

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

+0

“按每个节点的左值排序”是什么意思? – aioobe 2010-05-06 12:30:05

+0

如果您花时间查看我提供的有关分层数据的链接,并滚动到嵌套集的描述,您将看到它是什么。节点是树中的记录。 – wimvds 2010-05-06 13:44:00

相关问题