4

我有一个包含 3 列的产品表:
- id_product
- quantity_in_stock
- product_name

如果它= 0,我希望在结果底部有所有按 product_name 和 quantity_in_stock 排序的行。

我试过这个查询,但它不起作用:

(SELECT * 
FROM products 
WHERE quantity_in_stock != 0
ORDER BY product_name ASC)
UNION
(SELECT * 
FROM products 
WHERE quantity_in_stock = 0
ORDER BY product_name ASC)

也许有一种更简单的方法可以做到这一点,但现在是星期一!;)

4

1 回答 1

8

可以包含任意表达式,因此ORDER BY您可以评估那些= 0并为它们分配更高的值,以便稍后排序:

SELECT * 
FROM products
ORDER BY 
  /* If quantity_in_stock is 0, assign a 1 otherwise 0. The ones sort after 0 */
  CASE WHEN quantity_in_stock = 0 THEN 1 ELSE 0 END ASC,
  /* Then sub-order by name */
  product_name ASC

由于 MySQL 的布尔评估返回 1 或 0,您可以将其简化如下。但它不适用于每个 RDBMS:

SELECT * 
FROM products
ORDER BY
  /* Will return 0 (false) for quantity_in_stock <> 0 and 1 if true */
  (quantity_in_stock = 0) ASC,
  product_name ASC

但请注意,如果quantity_in_stock未编制索引,查询性能可能会因此受到负面影响。

于 2013-01-21T13:51:44.590 回答