SQL запрос сортировать по группам

#php #mysql #database

#php #mysql #База данных

Вопрос:

Привет, мне нужна помощь с запросами. вот мой запрос и структура таблицы.

 SELECT *
FROM products_description a, products b
where a.products_id=b.products_id
AND b.products_status >0
AND a.products_name LIKE '%".$q."%'
ORDER BY b.products_quantity DESC LIMIT 10 


---------------------------------------------------
| products_id | products_name | products_quantity |
---------------------------------------------------
|     980     |       SOS     |        21         |
---------------------------------------------------
|     101     |       GOLD    |        9          |
---------------------------------------------------
|     232     |       BALL    |        1          |
---------------------------------------------------
|     422     |       SONG    |        O          | 
---------------------------------------------------
|     371     |       ALL     |        O          | 
---------------------------------------------------
|     72      |       FISH    |        O          | 
---------------------------------------------------
  

Я бы хотел, чтобы он сортировался так, чтобы он был упорядочен в алфавитном порядке (product_name), сохраняя при этом количество с 0 внизу. Как правило, я хотел бы получить такой результат:

 ---------------------------------------------------
| products_id | products_name | products_quantity |
---------------------------------------------------
|     980     |       Ball    |        1          |
---------------------------------------------------
|     101     |       GOLD    |        9          |
---------------------------------------------------
|     232     |       SOS     |        21         |
---------------------------------------------------
|     422     |       All     |        O          | 
---------------------------------------------------
|     371     |       FISH    |        O          | 
---------------------------------------------------
|     72      |       SONG    |        O          | 
---------------------------------------------------
  

Ценю любую помощь!

Ответ №1:

 Select ...
From products_description a
    Join products b
        On a.products_id=b.products_id
Where b.products_status >0
    And a.products_name LIKE '%".$q."%'
Order By Case When products_quantity = 0 Then 1 Else 0 End Asc
    ,  a.products_name Asc
Limit 10 
  

Комментарии:

1. Эй, я использовал ваш, и это работает. Но на самом деле это: Порядок по регистру, когда products_quantity = 0, Затем 1, иначе 0 Завершается Asc , a.products_name

2. @Thomas: вау, такого синтаксиса я никогда раньше не видел! Что это значит Then 1 Else 0 ? Я имею в виду, как MySQL применяет 1 и 0 к полям? Спасибо!!

3. @Marco — Я использую выражение Case для создания другого столбца сортировки. Короче говоря, я говорю ему, что значения, равные нулю, должны сортироваться после значений, не равных нулю.

4. @Thomas: 1, потому что это здорово. Сегодня я узнал кое-что новое, и я действительно ценю этот синтаксис. Еще раз спасибо, отличный пост!!

5. @cybertai — Просто перечитайте свой OP, где вы сказали, что хотите отсортировать по имени, но с нулевыми значениями внизу. Скорректировал мой запрос для размещения.

Ответ №2:

Попробуйте

 SELECT *
FROM products_description a, products b
where a.products_id=b.products_id
AND b.products_status >0
AND a.products_name LIKE '%".$q."%'
ORDER BY (b.products_quantity = 0) DESC, products_name LIMIT 10
  

На данный момент я не уверен, нужно ли вам упорядочивать логическое выражение ASC или DESC просто попробуйте.

Ответ №3:

Если вы не ограничены 10 элементами, вы могли бы попробовать это:

 SELECT *
FROM products_description a, products b
where a.products_id=b.products_id
AND a.products_quantity > 0
AND b.products_status >0
AND a.products_name LIKE '%".$q."%'
ORDER BY b.products_name, b.products_quantity DESC
UNION ALL
SELECT *
FROM products_description a, products b
where a.products_id=b.products_id
AND a.products_quantity = 0
AND b.products_status >0
AND a.products_name LIKE '%".$q."%'
ORDER BY b.products_name