3

我有一个从 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、XL、XXL,而不是字母 L、M、S、XL、XXL。

这该怎么做?

4

5 回答 5

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

于 2012-09-28T11:16:23.693 回答
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

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

于 2012-09-28T11:08:09.120 回答
0

你可以用一个CASE语句来做到这一点,但我建议SortOrder在你的 Size 表中添加一列,并按此排序。

于 2012-09-28T11:07:57.747 回答
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
于 2012-09-28T11:09:14.977 回答
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',...)
于 2012-09-28T11:13:50.733 回答