mysql只选择尚未分配给任何其他值的唯一值

时间:2016-04-19 12:14:12

标签: mysql

我的数据库看起来像这样

id document_id resource_id language filename
1   11          120         English     abc
2   13          120         German      ghy
3   56          120         Norway      hyu
4   56          156         Norway      hyu
5   89          134         Hindi       uiy
6   90          120         English     qwer

在此我想获得resource_id 120的所有值。所以我可以进行像

这样的查询
SELECT * FROM `table` WHERE resource_id = 120

但正如您在表中看到的那样,document_id有一列,如果您仔细检查,则可以看到document_id 56已分配给两个资源。一个用于120,另一个用于156.因此,有人可以告诉我如何在mysql子查询中检查它。

所以我的输出将是它将仅显示resource_id 120的所有数据。如果任何其他资源被分配了与resource_id 120共享的任何document_id,则它将不会显示。因此,只应显示120个resource_id的唯一数据。

所以到目前为止我已经提出了我的查询

SELECT * 
  FROM `table` 
 WHERE resource_id = 120 
   AND `document_id` IN("SELECT `id` FROM `table` WHERE  `resource_id` <> 120 ")

那么有人能告诉我如何获得价值吗?任何帮助和建议都会非常明显。感谢

2 个答案:

答案 0 :(得分:1)

SELECT
    *
FROM
    `table`
WHERE
    resource_id = 120
AND document_id NOT IN (SELECT document_id FROM `table` WHERE resource_id <> 120);

答案 1 :(得分:0)

当其他答案陈述时,您可以使用NOT IN:

SELECT t.* 
  FROM `table` t            
 WHERE t.resource_id = :id 
   AND t.document_id NOT IN (
    SELECT document_id
      FROM `table`
     WHERE resource_id != t.resource_id
       )

但是,使用NOT EXISTS可能会获得更好的性能,因为您没有选择id进行比较:

SELECT t.* 
  FROM `table` t            
 WHERE t.resource_id = :id 
   AND NOT EXISTS (
    SELECT 1
      FROM `table`
     WHERE document_id = t.document_id 
       AND resource_id != t.resource_id
       )    

或者,有LEFT JOIN选项,搜索不匹配的行:

    SELECT t.* 
      FROM `table` t            
 LEFT JOIN `table` t1
        ON t1.document_id = t.document_id 
       AND t1.resource_id != t.resource_id
     WHERE t.resource_id = :id 
       AND t1.id IS NULL

我可能会选择你认为更易读的底部两个中的任何一个。