0

OK、それで私はこの質問を書いたときに提案された14のStack Overflowの提案を経験しました、そして私はすべてを試しました、そしてこれを理解することができません。

レビュー付きのジムディレクトリがあります。これらのジムを郵便番号、市/州、または近隣/市/州で検索できるスクリプトがあります。

バックエンドとデータベースにいくつかのフィールドがあります。この質問に関連するものは優先度(私はそれに1+の番号を付け、最初に最高または最低を最初に表示する必要があります)、写真(5枚の写真を含めることができます)、メンバーシップには(ジムがメンバーシップに含めることができるいくつかのこと)、およびレビュー(編集可能ではありませんが、ジムにあるレビューの数をカウントします)

この順番で並べ替えたい

ジムが優先される場合は、優先されるため、最初に表示する必要があります。ヌルの優先度が最後になる必要があります。次に、写真で並べ替えても問題ありません。ヌルが最後になります。次に、メンバーシップで並べ替えるには、ヌルが最後になります。次に、レビュー数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の有無にかかわらず他のすべての種類の組み合わせを試しましたが、それでも正しくソートされません。何が間違っているのかわかりません。

助けてください!

ありがとう、デビッド

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

2つの重要なアイデアが欠けていると思います。ifnullを使用してnull値を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 に答える