2013-06-24 83 views
-2

我的表:自定義排序在PHP/MySQL的

6 2/3/2013 row1 
10  2/2/2013 row2 
    1 1/3/2013 row3 
2  1/3/2013 row4 

如果COLUMN1具有價值(列2將是空的)排序行與欄3。 僅對第1列中具有值的行進行排序,而不對第2列中具有值的行進行排序。

如果column2的值(column1將爲空)按column2排序。 僅對列2中具有值的行進行排序,而不對列1中具有值的行進行排序。

排序:

第一次迭代:

First column column1 row1 is empty and column2 has value so comparing row1 and row3, 1 is minimum so is in top. 

    1 1/2/2013 row1 
10  2/2/2013 row2 
    6 2/3/2013 row3 
2  1/3/2013 row4 

第二次迭代:

First column column1 row2 is there so it comparing row2 and row4 for column3 date 1/3/2013 < 2/2/2013 so swap . 

    1 1/2/2013 row1 
2  1/3/2013 row2 
    6 2/3/2013 row3 
10  2/2/2013 row4 

第三次迭代:

First column column1 row3 is empty in first column so and comparing column2 since 1 < 6 so no changes. 

    1 1/2/2013 row1 
2  1/3/2013 row2 
    6 2/3/2013 row3 
10  2/2/2013 row4 

第四次迭代:

First column column1 row4 is there so it comparing row2 and row4 for column3 date 1/3/2013 < 2/2/2013 so nothing. 

    1 1/2/2013 row1 
2  1/3/2013 row2 
    6 2/3/2013 row3 
10  2/2/2013 row4 


Final Result After Sorting: 

    1 1/2/2013 row1 
2  1/3/2013 row2 
    6 2/3/2013 row3 
10  2/2/2013 row4 

在PHP/mysql中有很好的方法嗎?

我試着用PHP排序功能找不到解決方案。

謝謝。

+0

並且您是否想要保留具有第2列的行? –

+0

是在第2列和第1列都 – lil

+0

我不認爲有一種有效的方式(或任何方式)只有在SQL中獲得這種排序。我可能會採取PHP路線。但是,那麼應該沒有困難,你已經非常清楚地描述了你的算法,這是什麼問題? – RandomSeed

回答

1

謝謝你的一個有趣的問題。該解決方案似乎是:

SELECT *,col1+col2 p FROM test ORDER BY p; 

這對你的作品在這撥弄提供的測試數據:http://www.sqlfiddle.com/#!2/3c7e2/4

這個答案只會是如果正確,就像你說的,只有一個列有一個值。

+0

有趣的方法,但a)如果'col1'或'col2'可能爲空,請改用'COALESCE(col1,col2)',因爲'1 + NULL = NULL';和b)它不包括日期字段上的分類條件。 – RandomSeed