2012-12-02 149 views
0

好的,所以我已經經歷了14次我寫這個問題時建議的Stack Overflow建議,並且我已經嘗試了所有內容,並且無法弄清楚這一點。按多列對MYSQL結果排序

我有一個評論健身房目錄。我有一個腳本,您可以通過郵政編碼,城市/州或街區/城市/州搜索這些健身房。

我在後端和數據庫中有幾個字段。有關這個問題的優先權(我給它一個數字1+,它應該顯示最高首先或最低首先我不在乎哪些最好從最高到最低),照片(它可以有5張照片),會員包括(一幾件事情,健身房可以在會員包括)和評論(不可編輯,但保持的健身房多少審查計數)

我想在這個順序

排序如果健身房有優先權,它應該先顯示優先順序。空優先級應該是最後一個,然後按照照片排序並不重要a-z z -a只是null最後一個,然後按成員資格排序包括null最後一個,然後按檢查數排序0或最後一個空。

因此,如果我有4個健身房,A和B有優先權,照片和會員資格,但是有0個評論,C沒有優先權,沒有照片,沒有成員資格,但最高評論數是2,而D沒有優先權,照片和成員,但1條:應該排序順序:

GYM Priority Photo  Membership Reviews 
A  yes  has some has count 0 
B  yes  has some has count 0 
C  no   no   no memb.  2 
D  no   has some has count 1 

預期的排序結果:ABDC

對不起這就是混亂的。

繼承人什麼,我已經嘗試過:

SELECT * FROM (SELECT * FROM gym WHERE (city = "Queens") AND (state = "NY") GROUP BY priority ORDER BY photo, member_includes, reviews DESC) x LIMIT 0, 150 

SELECT * FROM (SELECT * FROM gym WHERE (city = "Queens") AND (state = "NY") ORDER BY priority, photo, member_includes, reviews DESC) x LIMIT 0, 150 

SELECT * FROM (SELECT * FROM gym WHERE (city = "Queens") AND (state = "NY") GROUP BY photo, member_includes, reviews ORDER BY priority DESC) x LIMIT 0, 150 

SELECT * FROM gym WHERE (city = "Queens") AND (state = "NY") GROUP BY photo, member_includes, reviews ORDER BY priority DESC LIMIT 0, 150 

SELECT * FROM gym WHERE (city = "Queens") AND (state = "NY") ORDER BY priority, photo, member_includes, reviews DESC LIMIT 0, 150 

我已經嘗試了所有其他類型的組合使用和不使用ASC但仍沒有正確排序。我不知道我做錯了什麼。

請幫忙!

謝謝, 大衛

+0

你提到的多個值,如照片和成員包括容易混淆。例如,有多張照片的健身房有多個記錄?你能[用一些虛擬數據創建一個小提琴](http://sqlfiddle.com/),讓我們看看實際的數據和數據庫結構是怎樣的? – inhan

+0

對不起!必須起飛幾天。我沒想過創造一個小提琴。下次雖然:) –

回答

3

我相信這是你在找什麼:

SELECT * FROM gym 
WHERE city = "Queens" AND state = "NY" 
ORDER BY 
    ISNULL(priority), priority, 
    ISNULL(photo), 
    ISNULL(member_includes), member_includes, 
    ISNULL(reviews), reviews DESC 
LIMIT 150 
+0

完美!非常感謝,然後一些。 –

2

在這裏你去 - 我想你錯過了兩個關鍵的想法:用IFNULL映射任何空值爲0,然後使用DESC進行排序,以便零(從NULL)排序到結尾。

這是如何爲你工作?:

create table gym (
    id int primary key auto_increment not null, 
    name varchar(255), 
    priority int, 
    photo int, 
    member_includes int, 
    reviews int 
); 

insert into gym 
(id, name, priority, photo, member_includes, reviews) values 
(DEFAULT, 'A', 1, 2, 3, 0), 
(DEFAULT, 'B', 1, 2, 3, 0), 
(DEFAULT, 'C', NULL, 0, 3, 0), 
(DEFAULT, 'D', NULL, 1, 3, 1); 

select name from gym 
order by ifnull(priority,0) desc 
    , ifnull(photo, 0) desc 
    , ifnull(member_includes, 0) desc 
    , ifnull(reviews, 0) desc ; 

+------+ 
| name | 
+------+ 
| A | 
| B | 
| D | 
| C | 
+------+ 
4 rows in set (0.00 sec)