2011-10-14 12 views
0

MySQLフィールドには6つのキーがあります。それらをタイプと呼ぶことができます。 PHPを使用して、$ orderという配列を定義し、これらの型を表示したい順に並べ替えます。プロトタイプによる注文

テーブルarticlesがあり、フィールドにはarticlesがあります。 type。どの記事にも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変数が注文した結果をフェッチのですか?

あなたはif文/ケースmysqlのスタイルにその配列をマッサージする必要があると思い
+0

http://stackoverflow.com/questions/2175439/mysql-custom-sortが役立つ可能性があります。 –

答えて

1

$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' "; 

は、このクエリを実行します。

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;     

このクエリは、完全にインデックス化され、可能な限り高速に実行します。

は今、あなたは参加して、あなたのソートキーとしてtest.sort使用使用して、このクエリに対してリンクすることができます。

+0

正しく理解すれば、このエンジンはすべてのデータをメモリに保存します。停電や再起動はどうですか? –

+0

@janisそれはあなたがコードを再起動するときに設定する必要がある並べ替え順序の単なるテンポラリテーブルです。永続的にテーブルを作成する場合は – Johan

+0

私はテンポラリテーブルを読んでいます。ありがとう! –