2014-06-22 130 views
0

我有两个表:Mysql的寻找到给定的值在所有子记录发现父记录

Parent: 
+-----------+-----------+ 
| parent_id | something | 
+-----------+-----------+ 
|  123 | x   | 
|  231 | y   | 
|  455 | z   | 
+-----------+-----------+ 

Relations: 
+-----+----------+--------------+--------------+ 
| id | parent_id| option_name | option_value | 
+-----+----------+--------------+--------------+ 
| 1 |  123 | Colors  | aaa   | 
| 2 |  231 | Colors  | bbb   | 
| 3 |  456 | Colors  | aaa   | 
| 4 |  456 | Country  | ddd   | 
+-----+----------+--------------+--------------+ 

我想要做的,是采取从在关系表我想所有选项父的所有行:

如:

SELECT * FROM Parent P 
LEFT JOIN Relations R ON R.parent_id = P.parent_id 
WHERE option_name = Colors 
AND option_value = aaa 
AND option_name = Country 
AND option_value = ddd 

以上查询我想一行PARENT_ID 455退回,因为它有两个选项。

PS: - 上面的查询是错误的,我给它只是作为我想要做 一个例子 - 我将有超过2个选项 - >其实际上从1到无限

我觉得这可以通过左连接来完成(对于每个需要的选项,添加一个不同的左连接......但总有一天选项表可能会达到数百万条记录,而且我不知道该查询的优化程度如何)

回答

0

您可以使用HAVING:

SELECT *, count(option_name) AS total FROM Parent P 
LEFT JOIN Relations R ON R.parent_id = P.parent_id 
WHERE (option_name = Colors 
AND option_value = aaa) 
OR (option_name = Country 
AND option_value = ddd) 
HAVING total > 1 

您更改HAVING条件以查找您正在寻找的选项数量

相关问题