2012-03-20 8 views
1

私はこのテーブルを持っています。このMySQLクエリで何が問題になっていますか

id name     parents 
1 Apparel                  
46 Apparel     1             
47 Child Apparel   1,46            
49 Child Apparel 2   46,1            

このクエリを試してみましたが正常に動作しました。

SELECT * FROM categories WHERE 1 IN (parents) 

id name   parents 
46 Apparel  1             
47 Child Apparel 1,46 

なぜこのクエリが2ではなく1つのレコードを表示するのですか?

SELECT * FROM categories WHERE 46 IN (parents) 

id name    parents 
49 Child Apparel 2 46,1 
+0

私には最初のクエリが結果の3行を返しているようです。それはまったく何ですか?多対多関係のようなもの?両方のクエリが同じように機能すると、指定された番号から親が始まる行が返されます – teran

+0

デザインはFirst Normal Formに違反し、可能であれば修正する必要がありますhttp://en.wikipedia.org/wiki/First_normal_form – heikkim

+0

@teranあなたは正しいです。 – Neutralizer

答えて

7

あなたは代わりにINのFIND_IN_SETを使用する必要があります。

SELECT * FROM categories WHERE FIND_IN_SET('46', parents) 

(注)このクエリが遅くなること。データベースを再設計する必要があります。私はあなたがMySQLの中で階層的データを格納するためのより良い方法を、このスライドショーを見てお勧め:

+0

これを複数のテーブルに正規化することは、このモデルより高速ですか? – Neutralizer

+2

+1 "あなたはデータベースを再設計するべきです" – Kaii

+0

@UmairAshraf:はい、正規化されたバージョンでは、インデックスをうまく利用できるため、パフォーマンスが向上します。 –

0

あなたがカテゴリテーブルを維持したい場合は、このテーブルを維持していworng方法があります。

親で

ルートカテゴリは、あなたがすることもでき

に言及よう

ので、親の列のみ、と多くて、その後1つの値1つの値を維持するルートカテゴリの値が含まれている親で1つの のサブカテゴリーが含まれています再帰関数を使用してそのレコードを取得します。

function showlist($parent) { 
$result = mysql_query("SELECT ID FROM categorie WHERE parentID='$parent'"); 
while ($line = mysql_fetch_array($result)) { 
if($catlistids!=""){ $catlistids .= ", "; } 
$catlistids .= $line["ID"]; 
showlist($line["ID"]); 

} 
return $catlistids; 

} 
+0

私は再帰的なものが嫌いです。私は何を意味するのか分からない。 – Neutralizer

+0

[リンク](http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set) –

関連する問題