MySQL中的特定ORDER BY子句

时间:2014-11-23 09:25:59

标签: mysql sql

我的MySQL数据库包含存储在4个类别中的多个产品。所有信息都在同一个表中:

id - name - description - price - category

我正试图按此顺序列出它们。我想知道如果可能的话,只能通过MySQL请求。

Cat1 : product-name-with-lower-price1
Cat2 : product-name-with-lower-price1
Cat3 : product-name-with-lower-price1
Cat4 : product-name-with-lower-price1

Cat1 : product-name-with-lower-price2
Cat2 : product-name-with-lower-price2
Cat3 : product-name-with-lower-price2
Cat4 : product-name-with-lower-price2

Cat1 : product-name-with-lower-price3
Cat2 : product-name-with-lower-price3
Cat3 : product-name-with-lower-price3
Cat4 : product-name-with-lower-price3

等...

我很抱歉不提供我测试的任何源代码,因为我尝试过的所有东西都不起作用。我想使用MySQL Order By子句但我不知道如何。

很多thx

编辑:

产品以较低价格列出。在提取每只Cat的较低价格后,我们按价格ASC订购。然后提取每只猫的下一个较低价格并按价格ASC订购等等......

所以看起来像这样:

Cars : Aygo 8000$
Moto : Suzuki 8200$
Bus : Renault 8700$
Truck : Peugeot 9000$

Cars : Toyota 9300$
Bus  :  Renault 9400$
Truck : DMG 9600$
Moto : Harley 14000$


Bus : Mercedes 12000$
Moto : BMW : 18000$
Cars : Mercedes 11000$
Truck : Renault 10000$

2 个答案:

答案 0 :(得分:2)

一种可能的方法:

SELECT id, price, category 
  FROM (
      SELECT @rownum := 
        (CASE
          WHEN @cat = t.category THEN @rownum + 1
          ELSE (@cat := t.category) IS NOT NULL
          END) criteria,
        t.* 
      FROM Table1 t
      ORDER BY category, price
  ) tt
ORDER BY tt.criteria, 
  FIELD(tt.category, 'Cat1', 'Cat2', 'Cat3');

SQL FiddleFIELD函数用于设置类别的特定顺序;如果您按照字母顺序对其进行排序,则可以将其替换为ORDER BY tt.criteria, tt.category

答案 1 :(得分:1)

这是对Raina方法的改进。该方法存在两个问题。第一个是子查询中的order by。无法保证子查询中的订单将以相同的顺序生成结果(它通常在MySQL中实际运行,但您不应该依赖于该行为)。第二个是在select中有多个变量赋值。 MySQL不保证分配顺序。

更安全的写作方式是:

SELECT id, price, category 
FROM (SELECT (@rownum := IF(@cat = t.category, @rownum + 1, 
                            IF(@cat := t.category, 1, 1) 
                           )
             )criteria,
             t.* 
      FROM Table1 t
      ORDER BY category, price
     ) tt
ORDER BY tt.criteria, tt.category;