我有两张桌子:
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到无限
我认为这可以通过左连接完成(对于每个需要的选项,添加一个不同的左连接...但是选项表有一天可以达到数百万条记录,而且我不知道这个查询的优化程度定)
答案 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条件以查找您要查找的选项数