2011-11-08 8 views
1

私はmysqlのリクエストで少し問題があります。ここでMySQLのオーダーby ... strange order

、私の要求です:

SELECT p.*, 
     pa.`id_product_attribute`, 
     pl.`description`, 
     pl.`description_short`, 
     pl.`available_now`, 
     pl.`available_later`, 
     pl.`link_rewrite`, 
     pl.`meta_description`, 
     pl.`meta_keywords`, 
     pl.`meta_title`, 
     pl.`name`, 
     i.`id_image`, 
     il.`legend`, 
     m.`name` AS manufacturer_name, 
     tl.`name` AS tax_name, 
     t.`rate`, 
     cl.`name` AS category_default, 
     DATEDIFF(
      p.`date_add`, 
      DATE_SUB(NOW(), 
      INTERVAL 0 DAY 
     )) > 0 AS new, 
     (p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice 
     FROM `ps_category_product` cp 
     LEFT JOIN `ps_product` p ON p.`id_product` = cp.`id_product` 
     LEFT JOIN `ps_product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) 
     LEFT JOIN `ps_category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = 2) 
     LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 2) 
     LEFT JOIN `ps_image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1)   
     LEFT JOIN `ps_image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = 2) 
     LEFT JOIN `ps_tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` AND tr.`id_country` = 8 AND tr.`id_state` = 0) 
     LEFT JOIN `ps_tax` t ON (t.`id_tax` = tr.`id_tax`) LEFT JOIN `ps_tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = 2) 
     LEFT JOIN `ps_manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` 
     WHERE cp.`id_category` = 4005 AND p.`active` = 1 ORDER BY p.`location` ASC 

そして、私の結果は、並べ替え、そのようなものです:

1,10,11,12,13,14,2,3,4,5,6 、7,8,9 ...

私のテーブルでは、場所はun varchar(64)として定義されています。 私はそれが問題だと思う...しかし、私はこのフィールドvarcharが必要...と私は(時には)このフィールドをint値としてソートする必要があります。

可能ですか?

はこれを試してみてください

+0

なぜそれをintとして保存しないと... – gbn

答えて

5

を読んでいただきありがとうございます:

ORDER BY CAST(p.location AS SIGNED) ASC 
+0

これは "AS SIGNED"です^^ INTEGERではありません。でもありがとう !あなたの答えはここに私をリダイレクトし、これは素晴らしいです! http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast –

0

マルコの答えがある限り、キャストがするように動作します... もう一つの方法は、先行ゼロ(「01」とパッドになり< '11 ')、どちらも素晴らしいです。

個人的には、私はロケーションテーブルを作成し、適切なキーを与え、関連するテーブルでそれを使用し、location_orderカラムを持ち、ジョインしてソートします。