0

好的,所以我已经阅读了我写这个问题时提出的 14 条 Stack Overflow 建议,我已经尝试了一切,但无法弄清楚。

我有一个带有评论的健身房目录。我有一个脚本,您可以通过邮政编码、城市/州或社区/城市/州搜索这些健身房。

我在后端和数据库中有一些字段。与这个问题有关的是优先级(我给它一个数字 1+,它应该首先显示最高或最低,我不在乎哪个最好从最高到最低),照片(它可以有 5 张照片),会员资格包括(a健身房可以包含在会员资格中的东西很少)和评论(不可编辑,但会计算健身房有多少评论)

我想按这个顺序排序

如果健身房有优先权,它应该首先显示,因为它是优先的。Null Priority 应该排在最后,然后按照片排序 az za just 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

预期排序结果: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 的组合,但它仍然不能正确排序。我不知道我做错了什么。

请帮忙!

谢谢,大卫

4

2 回答 2

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
于 2012-12-02T03:10:58.157 回答
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)
于 2012-12-02T03:14:20.963 回答