2012-12-02 148 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)