2011-10-14 36 views
0

MySQL字段中有6個可能的鍵。讓我們稱他們爲類型。通過PHP,我定義了一個名爲$ order的數組,並按照我希望它們出現的順序排列這些類型。按原型排序

有一個表,articles,其中有一個字段articlestype。任何文章可以添加0-6種類型。現在,我想要做的就是抓住所有的文章,並從原型中訂購它們。做這個的最好方式是什麼?這可以在MySQL中完成,因爲我想這會更快?如果沒有,如何在PHP中完成?

例子:

表:

id  articleId  type 
1  3    type1 
2  3    type2 
3  3    type3 
4  3    type4 
5  4    type5 
6  4    type6 
7  5    type5 
8  7    type1 
9  7    type5 

訂單:

$order=array('type1','type2','type3','type4','type5','type6'); 

我如何獲取我的$order可變訂購的結果嗎?

+0

http://stackoverflow.com/questions/2175439/mysql-custom-sort可能會有所幫助。 –

回答

1

你需要按摩數組到MySQL風格,如果/ case語句:

$order_by = "ORDER BY CASE"; 
$pos = 1; 
foreach ($order as $clause) { 
    $order_by .= " CASE `type`='$clause' THEN " . $pos++; 
} 
$order_by .= " ELSE " . $pos++; 

這將產生類似

ORDER BY CASE 
    WHEN `type`='type1' THEN 1 
    WHEN 'type`='type2' THEN 2 
    ... 
    ELSE n 
+0

不錯。明天會試用。謝謝! –

+0

工作就像一個魅力。 –

1

可這在MySQL來完成,因爲我想這會更快?

只有當你允許MySQL使用索引

您可以創建一個臨時表:

$query = "CREATE TABLE IF NOT EXISTS test (
      sort INT NOT NULL AUTO_INCREMENT, 
      `type` VARCHAR(20) NOT NULL, 
      PRIMARY KEY (sort), 
      KEY (`type`, sort) 
      ENGINE=MEMORY (SELECT 1,'other' <<-- see query below. 
        UNION SELECT 2,'type1' <<-- build this part using 
        UNION SELECT 3,'type2' <<-- Marc B's code. 
        UNION SELECT 4,'type3' 
        UNION SELECT 5,'type4' 
        UNION SELECT 6,'type5' 
        UNION SELECT 7,'type6' "; 

運行此查詢。

現在你可以使用連接,並使用test.sort作爲排序關鍵字與此查詢鏈接:

SELECT t1.id, t1.article_id, COALESCE(t.`type`,'other') as sort_type 
FROM table1 t1 
LEFT JOIN test t ON (t1.`type` = t.`type`) 
WHERE .... 
ORDER BY t.sort;     

此查詢將被完全索引,並儘可能快地運行。

+0

如果我理解正確,該引擎會將所有數據保存在內存中。停電或重新啓動怎麼辦? –

+0

@janis它只是一個臨時表,當你的代碼重新啓動時,你需要設置它的排序順序,如果你想永久使它成爲一個innodb表 – Johan

+0

我讀了臨時表,它現在已經清楚了。謝謝! –