我的数据库看起来像这样
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 ")
那么有人能告诉我如何获得价值吗?任何帮助和建议都会非常明显。感谢
答案 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
我可能会选择你认为更易读的底部两个中的任何一个。