如何订购此查询

时间:2012-09-28 11:05:19

标签: mysql sql

我有一个查询从mysql数据库中获取产品。它是这样的:

SELECT p.name, p.description, p.price, ps.sizename 
FROM products p
JOIN product_sizes ps ON ps.id = p.size_id

它提取的查询的sizename可以是S,M,L等,还有38,39,40等。

我现在想要的是,对于这个查询,是按照sizename进行排序,但是对它进行排序,以便当大小为数字时,它会对数字进行排序,但是当它是S,M,L时,它会在右边排序方式,所以S,M,L,XL,XXL,而不是字母L,M,S,XL,XXL。

怎么做?

5 个答案:

答案 0 :(得分:2)

这应该有效:

SELECT p.name, p.description, p.price, ps.sizename 
FROM products p
JOIN product_sizes ps ON ps.id = p.size_id
order by case when CONVERT(sizename, SIGNED INTEGER) IS NOT NULL 
    THEN CONVERT(sizename, SIGNED INTEGER) 
    ELSE -CAST(-1 AS UNSIGNED) END ASC
, case sizename WHEN 'S' THEN 1 
            WHEN 'M' THEN 2
            WHEN 'L' THEN 3
            WHEN 'XL' THEN 4
            WHEN 'XXL' THEN 5 END ASC
, sizename ASC

这是一个小提琴:http://sqlfiddle.com/#!2/4a3fb/1/0

答案 1 :(得分:1)

order by case when ps.sizename in (38,39,40)
              then ps.sizename
              when ps.sizename = 'XS'
              then 1
              when ps.sizename = 'S'
              then 2
              when ps.sizename = 'M'
              then 3
              when ps.sizename = 'L'
              then 4
              when ps.sizename = 'XL'
              then 5
              when ps.sizename = 'XXL'
              then 6
         end

您可以根据需要调整字母数字顺序的数字

答案 2 :(得分:0)

您可以使用CASE语句执行此操作,但我建议您在“大小”表格中添加SortOrder列,然后按此排序。

答案 3 :(得分:0)

尝试

   ORDER BY 
        CASE    WHEN sizename='S'    THEN 38 
                WHEN sizename='M'    THEN 39
                WHEN sizename='L'    THEN 40
                WHEN sizename='XL'   THEN 42
                WHEN sizename='XXL'  THEN 44
                WHEN sizename REGEXP ('[0-9]') THEN sizename
        END

答案 4 :(得分:0)

尝试按照您想要的顺序指定现有值,如下所示:

SELECT p.name, p.description, p.price, ps.sizename 
FROM products p
JOIN product_sizes ps ON ps.id = p.size_id
ORDER BY FIELD(ps.sizename,'S','M','L','XL','XXL',...)
相关问题