根据多个列对结果行进行排序

时间:2016-03-18 13:00:55

标签: mysql sql-order-by

我必须放下具有两个不同字段且value = 0

的行

让我解释一下,所有stock_it=0stock_eu=0的记录都必须放在结果的底部

我已经使用过这个解决方案,但是,它并不是严格正确的,因为它甚至会放下没有两个值的行= 0

$dati = mysql_query("
    SELECT      * 
    FROM        $tb_article
    ORDER BY
        FIELD($tb_art.article_status,'n') DESC, 
        FIELD($tb_art.article_stock_it,'0') ASC, 
        FIELD($tb_art.article_stock_eu,'0') ASC,  
        $tb_art.article_rank
");
  1. article_status=n表示新产品,他们必须保持领先!
  2. 将库存IT和库存EU = 0(产品不可用)
  3. 的所有商品推到最底层
  4. 最后,根据指定的等级订购其余文章

2 个答案:

答案 0 :(得分:2)

您可以在CASE中使用ORDER BY语句,如下所示:

SELECT      * 
FROM        $tb_article
ORDER BY
   CASE WHEN article_status = 'n' THEN 0
        WHEN article_stock_it = 0 THEN 100000
        WHEN article_stock_eu = 0 THEN 100000
        ELSE article_rank
   END 

答案 1 :(得分:1)

如果您想使用ORDER BY FIELD: SQL Fiddle

MySQL 5.6架构设置

CREATE TABLE tb_article
(
    article_stock_it int,
    article_stock_eu int,
    article_status varchar(11),
    article_rank int
);

INSERT INTO tb_article VALUES
  (1, 1, 'n', 1)
, (0, 1, 'n', 1)
, (0, 0, 'n', 1)
, (1, 1, 'o', 1)
, (1, 1, 'o', 2);

查询1

SELECT      * 
    FROM        tb_article
    ORDER BY
        FIELD(tb_article.article_status,'n') DESC, 
        FIELD(
          IF(tb_article.article_stock_it = 0 AND tb_article.article_stock_eu = 0,'1','0')
          ,'0') DESC,
       tb_article.article_rank

<强> Results

| article_stock_it | article_stock_eu | article_status | article_rank |
|------------------|------------------|----------------|--------------|
|                1 |                1 |              n |            1 |
|                0 |                1 |              n |            1 |
|                0 |                0 |              n |            1 |
|                1 |                1 |              o |            1 |
|                1 |                1 |              o |            2 |
相关问题