3

mysqlデータベースから製品を取得するクエリがあります。これは次のようなものです。

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

このクエリがフェッチするサイズ名は、S、M、Lなどですが、38、39、40などもあります。

私が今欲しいのは、このクエリでは、sizenameで並べ替えることですが、サイズが数値の場合は数値で並べ替えられますが、S、M、Lのようなものの場合は、正しい方法で並べ替えられるように並べ替えます。 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

次のように、既存の値を必要な順序で指定してみてください。

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 に答える
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 に答える