2011-10-14 32 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

我读了临时表,它现在已经清楚了。谢谢! –