MySQL упорядочить по ... странному порядку - PullRequest
1 голос
/ 08 ноября 2011

У меня небольшая проблема с заказом в запросе mysql.

Вот мой запрос:

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.

Возможно ли это?

Спасибодля чтения

Ответы [ 2 ]

5 голосов
/ 08 ноября 2011

Попробуйте это:

ORDER BY CAST(p.location AS SIGNED) ASC
0 голосов
/ 08 ноября 2011

Ответ Марко будет работать так же долго, как и актерский состав ... Еще один способ - заполнить ведущими нулями ('01' <'11'), хотя ни один из них не является хорошим.создать таблицу местоположений, дать ей подходящий ключ, использовать ее в связанных таблицах и иметь столбец location_order, объединить и отсортировать. </p>

...