Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL仅选择存在多个关系的行_Mysql_Sql_Select - Fatal编程技术网

Mysql SQL仅选择存在多个关系的行

Mysql SQL仅选择存在多个关系的行,mysql,sql,select,Mysql,Sql,Select,给定父表“parent” ╔═══════════╦══════════╗ ║ PARENT_ID ║ NAME ║ ╠═══════════╬══════════╣ ║ 1 ║ bob ║ ║ 2 ║ carol ║ ║ 3 ║ stew ║ ╚═══════════╩══════════╝ 以及父级和(此处未指定)属性表之间的多个关系表“rel” ╔═══════════╦═══════════╗ ║ PARE

给定父表“parent”

╔═══════════╦══════════╗
║ 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
更新1

如果未对每个
父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。我的错。