2012-01-27 14 views
2

カテゴリ、サブカテゴリ、サブカテゴリを持つメニューを構築するスクリプトを作成しました。 これらのアイテムを取得するには、3つの別々のMySQLクエリを使用します。次のように:カテゴリとサブカテゴリを取得するmysqlクエリを最適化する方法

は、主なカテゴリを取得するには、次の

SELECT id, name FROM categories WHERE parent_id=? 

SELECT id, name FROM categories WHERE parent_id=0 

は、私が使用する各カテゴリのサブカテゴリを取得するには?親カテゴリのIDです。 その後、各サブカテゴリに対して再度クエリを実行します。

このスクリプトを最適化して、より少ないSQLクエリを使用するにはどうすればよいですか? ありがとうございます。

+0

あなたがする何をしたいですか達成?とにかくすべてのカテゴリをフェッチしている場合は、それらのすべてを選択し、配列に保存してツリー構造で整理することができます(カテゴリを保存するときは、親レコードが既にある場合にチェックし、子供のように保存してください) – mishu

+0

本当に!私たちの惑星には緑の猫がいます。 – Husam

答えて

11

この文字列で検索してください -

カテゴリ+サブカテゴリー:

SELECT c1.id, c1.name, c2.id, c2.name FROM categories c1 
    LEFT JOIN categories c2 
    ON c2.parent_id = c1.id 
WHERE c1.parent_id = 0 

カテゴリ+サブカテゴリー+サブサブカテゴリー:

SELECT c1.id, c1.name, c2.id, c2.name, c3.id, c3.name FROM categories c1 
    LEFT JOIN categories c2 
    ON c2.parent_id = c1.id 
    LEFT JOIN categories c3 
    ON c3.parent_id = c2.id 
WHERE c1.parent_id = 0 
+0

これは完全に機能します。ありがとう。投票が行われ、時間が経過するとすぐに承認されます:) –

+1

はい、このクエリはサブカテゴリのみを表示します。 1つ以上のレベルを表示するには、もう1つJOINを追加します。 – Devart

+0

カテゴリのレベル数がわからない場合は、このクエリをどのように書くことができますか? – anoop

2

一部のデータベース・サーバが支援する構造を持っていますこれらの操作。しかし、MySQLはその一つではありません。

より効率的な階層をデータベースに格納する方法があります。詳しくは、この記事をご覧ください。ネストされたセットを紹介します。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

0

代替あなたが唯一のカテゴリの親カテゴリにしたい場合は(結果の行数は、カテゴリ/サブカテゴリ行数と同じでなければなりません):

SELECT c1.id, c1.name, c2.id, c2.name 
    FROM category c1 
     LEFT JOIN category c2 ON c1.parent_id = c2.id 
関連する問題