Mysql SQL仅选择存在多个关系的行
给定父表“parent”Mysql SQL仅选择存在多个关系的行,mysql,sql,select,Mysql,Sql,Select,给定父表“parent” ╔═══════════╦══════════╗ ║ PARENT_ID ║ NAME ║ ╠═══════════╬══════════╣ ║ 1 ║ bob ║ ║ 2 ║ carol ║ ║ 3 ║ stew ║ ╚═══════════╩══════════╝ 以及父级和(此处未指定)属性表之间的多个关系表“rel” ╔═══════════╦═══════════╗ ║ PARE
╔═══════════╦══════════╗
║ PARENT_ID ║ NAME ║
╠═══════════╬══════════╣
║ 1 ║ bob ║
║ 2 ║ carol ║
║ 3 ║ stew ║
╚═══════════╩══════════╝
以及父级和(此处未指定)属性表之间的多个关系表“rel”
╔═══════════╦═══════════╗
║ PARENT_ID ║ PROP_ID ║
╠═══════════╬═══════════╣
║ 1 ║ 5 ║
║ 1 ║ 1 ║
║ 2 ║ 5 ║
║ 2 ║ 4 ║
║ 2 ║ 1 ║
║ 3 ║ 1 ║
║ 3 ║ 3 ║
╚═══════════╩═══════════╝
如何选择具有所有指定关系集的所有父级?例如,通过样本数据,我如何找到同时拥有财产5和财产1的所有父母
编辑: 同样的问题,但要求精确匹配: 这被称为
SELECT a.name
FROM parent a
INNER JOIN rel b
ON a.parent_ID = b.parent_ID
WHERE b.prop_id IN (1,5)
GROUP BY a.name
HAVING COUNT(*) = 2
父id
的属性id
实施唯一约束,则在这种情况下需要DISTINCT
SELECT a.name
FROM parent a
INNER JOIN rel b
ON a.parent_ID = b.parent_ID
WHERE b.prop_id IN (1,5)
GROUP BY a.name
HAVING COUNT(DISTINCT b.prop_id) = 2
将第一个表命名为a,第二个表命名为b
SELECT parent_id FROM prop b1
WHERE prop_id=1 and
EXISTS (SELECT parent_id FROM prop b2
WHERE b2.parent_id=b1.parent_id AND b2.prop_id=5)
我只是看到了一个不同的问题,似乎适合这种情况:
SELECT distinct parent_id
FROM rel as T1
INNER JOIN rel as T2
ON T1.parent_id = T2.parent_id
WHERE T1.prop_id = '1' and T2.prop_id = '5'
我已将您的表写入CTE,如果您需要帮助以适应您的目的,请告诉我
;WITH MyTable AS
(
SELECT parent_id = 1
,prop_id = 5 UNION ALL
SELECT 1,1 UNION ALL
SELECT 2,5 UNION ALL
SELECT 2,4 UNION ALL
SELECT 2,1 UNION ALL
SELECT 3,1 UNION ALL
SELECT 3,3
)
,Eval AS
(
SELECT parent_id
,PropEval = SUM(CASE WHEN prop_id IN (1,5) THEN 1 ELSE 0 END)
FROM MyTable
GROUP BY parent_id
)
SELECT parent_id
FROM Eval
WHERE PropEval = 2
这假设父id和属性id的组合总是唯一的。您可以修改
HAVING
子句以更精确地返回:HAVING COUNT(DISTINCT b.prop_id)=2
@Nicarus yes,如示例记录所示。但是如果它们不是唯一的,假设表上有另一个字段使列唯一,则需要一个DISTINCT
关键字。我很好奇-为什么需要使用'count'子句?查询返回的记录数等于条件中的值数,请尝试执行此命令,在a.parent\u ID=b.parent\u ID,其中b.prop\u ID位于(1,5)
中,从parent a内部连接rel b中选择a.name并查看差异。我意识到我错过了一个片段。在下面发布了附加要求:如果您需要查找另一个prop\u id
?你需要再次加入吗?浪费资源。这可能是浪费计算资源,但是答案是完全正确的,可能会为程序员节省大量的思考资源,因此值得考虑。不要过早地优化!不幸的是,mysql不支持cte。非常抱歉,我没有意识到这只是mysql。我的错。