Mysql查找父记录,其中在所有子记录中找到给定值

时间:2014-06-22 10:39:34

标签: mysql sql foreign-keys

我有两张桌子:

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          |
+-----+----------+--------------+--------------+

我想要做的是从Parent中获取所有在“关系”表中包含我想要的所有选项的行:

例如:

 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的行,因为它有两个选项。

P.S: - 上面的查询错了,我把它作为我想要做的一个例子       - 我将有两个以上的选项 - >实际上从1到无限

我认为这可以通过左连接完成(对于每个需要的选项,添加一个不同的左连接...但是选项表有一天可以达到数百万条记录,而且我不知道这个查询的优化程度定)

1 个答案:

答案 0 :(得分: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条件以查找您要查找的选项数