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

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

我想要做的是从父级中获取关系表中具有我想要的所有选项的所有行:

例如:

 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: - 上面的查询是错误的,我给出它只是作为我想做的事情的一个例子 - 我将有超过 2 个选项 -> 实际上从 1 到无限

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

最佳答案

您可以使用 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 条件来查找您要查找的选项数量

关于Mysql查找父记录,其中给定值在所有子记录中找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350411/

相关文章:

database - 数据库设计和性能 : Is it OK to use redundant FK to increase performance?

mysql - 执行 codeigniter 时数据库出错

php - 找到没有 child 的行,如果有 child 最新的 child

sql - Excel数据表(SQL查询): Once deleted column no longer shows up

sql - 在 7 天滚动窗口中获取结果,该窗口因每个用户而异

sql - Decode 与 NVL 函数有什么区别?

java - 设置 Apache Mahout 以使用 MySql

php - 为 SQL 行分配唯一页

mysql - 为什么我会收到此错误 : Error 1215 Cannot add Foreign key constraint?

mysql - 在MySql中禁用插入操作中的外键检查