好的,所以我在编写这个问题时已经完成了14个Stack Overflow建议,并且我已经尝试了所有内容,并且无法解决这个问题。
我有健身房目录和评论。我有一个脚本,您可以通过邮政编码,城市/州或邻里/城市/州搜索这些健身房。
我在后端和数据库中有几个字段。与这个问题有关的是优先权(我给它一个数字1+它应该显示最高的第一个或最低的我不关心哪个最好从最高到最低),照片(它可以有5张照片),会员资格包括(a健身房可以包含在会员中的一些东西)和评论(不可编辑,但记录健身房有多少评论)
我想按此顺序排序
如果健身房具有优先权,则应优先显示健身房。 Null优先级应该是最后的,然后按照照片排序并不重要a-z z-a只是null来到最后,然后按成员资格排序包括null到最后,然后按审查计数0或null排在最后。
所以,如果我有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
预期的排序顺序结果:A B D C
很抱歉这令人困惑。
继承人我已经尝试过的事情:
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 :(得分: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
答案 1 :(得分: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)