2012-03-20 219 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 

爲什麼這個查詢帶來1條記錄而不是2條?

SELECT * FROM categories WHERE 46 IN (parents) 

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

在我看來,第一個查詢已返回3行結果。它是什麼?像多對多的關係?你的查詢同樣工作,他們返回父母從指定數字開始的行 – teran 2012-03-20 13:44:46

+0

設計違反了第一範式,如果可能你應該修復它http://en.wikipedia.org/wiki/First_normal_form – heikkim 2012-03-20 13:47:41

+0

@teran你是對的。 – Neutralizer 2012-03-20 13:51:36

回答

7

您應該使用FIND_IN_SET代替的:

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

注意這個查詢將是緩慢的。你應該重新設計你的數據庫。我建議你看看這個幻燈片更好的方式來存儲在MySQL heirarchical數據:

+0

你的意思是規範化它到多個表是這個模型更快? – Neutralizer 2012-03-20 13:43:50

+2

+1「你應該重新設計你的數據庫」 – Kaii 2012-03-20 13:44:07

+0

@UmairAshraf:是的,規範化的版本可以提供更好的性能,因爲它能夠更好地使用索引。 – 2012-03-20 14:04:52

0

如果你想維持類別表有你有保持這種表撥錯路。

根類別只包含父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 2012-03-20 13:50:52

+0

你可以使用[link](http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_find-in-set) – 2012-03-20 13:58:01