Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 - Fatal编程技术网

Mysql 从SQL查询中排除记录

Mysql 从SQL查询中排除记录,mysql,sql,Mysql,Sql,给定一个或多个所有者id,例如2、4和6,我想返回资源列表。由所有者链接到所有者的id拥有资源。没问题,我可以从ohr.owners\u id中选择不同的ohr.resources\u id,其中ohr.owners\u id在2,4,6中 现在我被卡住了。我想返回resources.id列表,与上面相同,但不包括由owners.deleted确定的链接到未删除所有者的任何资源=如果由所有者确定链接未被删除,\u has\u resources.deleted=真的 可以假设owner.dele

给定一个或多个所有者id,例如2、4和6,我想返回资源列表。由所有者链接到所有者的id拥有资源。没问题,我可以从ohr.owners\u id中选择不同的ohr.resources\u id,其中ohr.owners\u id在2,4,6中

现在我被卡住了。我想返回resources.id列表,与上面相同,但不包括由owners.deleted确定的链接到未删除所有者的任何资源=如果由所有者确定链接未被删除,\u has\u resources.deleted=真的

可以假设owner.deleted对于最初提供的所有owner_id(即2、4、6)都是真的

例如,给定所有者id 2和4,我应该返回资源id 2和3。请注意,我的意思是deleted=TRUE表示该问题已被删除,但由于已经发布了使用前一个问题的答案,因此我将不编辑该问题。相反,下面的真值表显示所有者未删除和资源未删除

那怎么办

SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id
WHERE ohr.owners_id IN (2,4,6)
AND (o.deleted = FALSE OR ohr.deleted = FALSE);

首先选择所需的数据,然后仅选择“不存在”块中未删除的所有者未引用的数据


如果您能就一种方法是否优于另一种方法发表意见,我将不胜感激。

您的用户表是什么?这张表与其他表链接了吗?对不起,输入错误。那应该是业主。我会更新的。很明显你需要什么。但我会让你放心。你能给我一点数据样本吗。“这样我才能确定你在问什么?”JorgeCampos正在研究。我的实际查询实际上要多一些,我希望我没有过度简化上面的内容。因为现在是Wistar的答案似乎解决了这个问题。但我觉得事情比这复杂一点:谢谢StephaneM。我想它应该是o.deleted=FALSE或ohr.deleted=FALSE,但这似乎会导致其他问题。@user1032531我做了更改。您在该查询中面临什么问题?给定您的第一个查询以及我编辑的帖子上的虚构数据,它将仅返回资源id 3,而您编辑的查询将返回1、2和3。它应该只返回2和3。@user1032531我不确定我是否得到了您想要的。表的第一行和第二行实际上是相同的,但是对于资源\u id。那么为什么要返回资源\u id 2而不是资源\u id 1?因为所有者5仍然需要它。所有者5尚未被删除,其与资源2的链接也未标记为已删除。
SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id
WHERE ohr.owners_id IN (2,4,6)
AND (o.deleted = FALSE OR ohr.deleted = FALSE);
SELECT DISTINCT ohr.resources_id 
FROM owners_has_resources ohr 
JOIN owners o ON ohr.owners_id = o.id
WHERE ohr.owners_id IN (2,4,6)
AND NOT EXISTS (
    SELECT NULL FROM owners_has_resources ohr2 
    JOIN owners o2 ON ohr2.owners_id = o2.id
    WHERE ohr2.deleted=FALSE 
    AND o2.deleted=FALSE
    AND ohr.resources_id=ohr2.resources_id 
)
SELECT DISTINCT ohr1.resources_id
FROM owners_has_resources ohr1
LEFT OUTER JOIN owners_has_resources ohr2 ON ohr2.resources_id=ohr1.resources_id AND ohr2.deleted = TRUE
LEFT OUTER JOIN owners o ON o.id=ohr2.owners_id AND ohr2.deleted = TRUE
WHERE ohr1.owners_id IN (2,4,6) AND o.id IS NULL;
SELECT DISTINCT ohr1.resources_id
FROM owners_has_resources ohr1
LEFT OUTER JOIN owners_has_resources ohr2 ON ohr2.resources_id=ohr1.resources_id
LEFT OUTER JOIN owners o ON o.id=ohr2.owners_id
WHERE ohr1.owners_id IN (2,4,6) AND o.id IS NULL AND ohr2.deleted = TRUE AND ohr2.deleted = TRUE;