#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