我的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$
答案 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 Fiddle。 FIELD
函数用于设置类别的特定顺序;如果您按照字母顺序对其进行排序,则可以将其替换为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;