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