这与this question密切相关,但增加了另一项要求。
给定父表'父'
╔════════════╦════════╗
║ 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完全相关的所有父母?
答案 0 :(得分:10)
SELECT PARENT_ID
FROM rel
GROUP BY PARENT_ID
HAVING SUM(PROP_ID NOT IN (5,1)) = 0
AND SUM(PROP_ID = 1) = 1
AND SUM(PROP_ID = 5) = 1
答案 1 :(得分:3)
如果您想选择至少 a 5和1的所有父母,您可以使用:
SELECT PARENT_ID
FROM rel
GROUP BY PARENT_ID
HAVING SUM(PROP_ID = 1)
AND SUM(PROP_ID = 5)
AND SUM(PROP_ID NOT IN (5,1)) = 0
如果您需要完全一个5和一个1,请参阅this回答
答案 2 :(得分:2)
有两个嵌套的子查询,像这样......
Select pa.Id
From parents pa
Where not exists -- This ensures that all specifies properties exist
(Select * From property y
Where propertyId In (1,5)
And Not Exists
(Select * From parentProperty
Where parentId = pa.parentId
And propertyId = y.propertyId ))
And not exists -- This ensures that only specified list of properties exist
(Select * From parentProperty
Where parentId = pa.parentId
And propertyId Not In (1,5) )
第一个读 “显示所有父母,其中 不 属性在指定父级的父属性表中的指定属性列表中....”< / p>
第二个子查询如下: “还要确保在父项的parentProperties表中不存在指定列表中 不 的任何属性的记录。”
答案 3 :(得分:2)
SELECT PARENT_ID
FROM rel
GROUP BY PARENT_ID
HAVING
COUNT(PROP_ID)=2 AND
COUNT(DISTINCT case when PROP_ID IN ( 1, 5 ) then PROP_ID end)=2
这将选择恰好有两行的所有PARENT_ID
,其中只有两行,非重复,PROP_ID
匹配。
答案 4 :(得分:2)
此备选方案具有常量语句结构和仅一个参数的优点,与您要查找的关系数量无关:
SELECT parent_id FROM rel
GROUP BY parent_id
HAVING GROUP_CONCAT(prop_id ORDER BY prop_id ASC SEPARATOR ",") = '1,5';
缺点:
答案 5 :(得分:1)
假设(PARENT_ID,PROP_ID)是唯一的:
SELECT r1.PARENT_ID
FROM rel r1
INNER JOIN rel r2 ON r1.PARENT_ID = r2.PARENT_ID AND r2.PROP_ID = 5
INNER JOIN rel r3 ON r1.PARENT_ID = r3.PARENT_ID AND r3.PROP_ID = 1
GROUP BY r1.PARENT_ID
HAVING COUNT(*) = 2
或者,
SELECT parent.PARENT_ID
FROM parent
INNER JOIN
(
SELECT PARENT_ID
FROM rel
WHERE PROP_ID IN (1,5)
GROUP BY PARENT_ID
HAVING COUNT(*) = 2
) good ON parent.PARENT_ID = good.PARENT_ID
LEFT OUTER JOIN rel bad ON parent.PARENT_ID = bad.PARENT_ID
AND bad.PROP_ID NOT IN (1,5)
WHERE bad.PARENT_ID IS NULL
甚至,
SELECT DISTINCT parent.PARENT_ID
FROM parent
INNER JOIN rel r2 ON parent.PARENT_ID = r2.PARENT_ID AND r2.PROP_ID = 5
INNER JOIN rel r3 ON parent.PARENT_ID = r3.PARENT_ID AND r3.PROP_ID = 1
LEFT OUTER JOIN rel r0 ON parent.PARENT_ID = r0.PARENT_ID
AND r0.PROP_ID NOT IN (1,5)
WHERE r0.PARENT_ID IS NULL
答案 6 :(得分:0)
如果MySql支持minus
,查询可能如下所示:
select parent_id
from rel
where prop_id in (5,1)
group by parent_id
having count(distinct prop_id)=2 and count(prop_id)=2
minus
select parent_id
from rel
where prop_id not in (5,1);
not in
将删除超过(5,1)的关系,例如(5,1,3)。
我知道你正在使用MySql,因此我的答案是错误的。把它作为另一个想法。
答案 7 :(得分:0)
即使(PARENT_ID,PROP_ID)不唯一,此查询也为真:
SELECT PARENT_ID FROM rel WHERE
PROP_ID IN (5,1) AND
PARENT_ID NOT IN (SELECT DISTINCT PARENT_ID FROM rel WHERE PROP_ID NOT IN (5,1))
GROUP BY PARENT_ID HAVING COUNT(DISTINCT PROP_ID) = 2
答案 8 :(得分:-1)
希望这会对你有所帮助:
SELECT p.PARENT_ID , r.PROP_ID FROM rel r LEFT JOIN parent p ON p.PARENT_ID = r.PARENT_ID WHERE r.PROP_ID = 5 OR r.PROP_ID = 1
答案 9 :(得分:-3)
您可以通过分组执行此操作。
SELECT PARENT_ID 来自link_tbl PROP_ID IN(5,1) GROUP BY PARENT_ID 有COUNT(*)= 2