如何 return 在 MySQL 中的标签关系 table 中没有匹配的记录?
How to return records which don't have a match in a tag relation table in MySQL?
给定标签(即:“动物”),我如何 return 来自对象 table 的记录 没有 标记“动物”?
对象Table:
object_id
object_name
1
cat
2
dog
3
truck
4
car
标签Table:
tag_id
tag
1
animal
2
vehicle
3
red
对象标签 Table:
tag_id
object_id
1
1
1
2
3
2
2
3
2
4
3
4
我正在做这样的事情。但是,'dog' 仍在 returning 因为它有一个匹配的标签 'red'。
SELECT o.*
FROM objects o
LEFT JOIN object_tags ot
ON ot.object_id = o.object_id
LEFT JOIN tags t
ON ot.tag_id = t.tag_id
AND LOWER(t.tag) = LOWER('animal')
WHERE t.label IS NULL
GROUP BY o.object_id
I'm doing something like this. However, 'dog' is still returning
because it has a matching tag for 'red'.
根据数据示例,唯一排除的记录应该是 object_id=1
您可以使用 NOT EXISTS
这将排除具有 tag='animal'
:
的记录
select o.*
from objects o
where not exists (select 1 from object_tags ot
inner join tags t on ot.tag_id=t.tag_id
where o.object_id=ot.object_id
and t.tag='animal'
);
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b96e6ab628cb2347838c2e8f253d0475
给定标签(即:“动物”),我如何 return 来自对象 table 的记录 没有 标记“动物”?
对象Table:
object_id | object_name |
---|---|
1 | cat |
2 | dog |
3 | truck |
4 | car |
标签Table:
tag_id | tag |
---|---|
1 | animal |
2 | vehicle |
3 | red |
对象标签 Table:
tag_id | object_id |
---|---|
1 | 1 |
1 | 2 |
3 | 2 |
2 | 3 |
2 | 4 |
3 | 4 |
我正在做这样的事情。但是,'dog' 仍在 returning 因为它有一个匹配的标签 'red'。
SELECT o.*
FROM objects o
LEFT JOIN object_tags ot
ON ot.object_id = o.object_id
LEFT JOIN tags t
ON ot.tag_id = t.tag_id
AND LOWER(t.tag) = LOWER('animal')
WHERE t.label IS NULL
GROUP BY o.object_id
I'm doing something like this. However, 'dog' is still returning because it has a matching tag for 'red'.
根据数据示例,唯一排除的记录应该是 object_id=1
您可以使用 NOT EXISTS
这将排除具有 tag='animal'
:
select o.*
from objects o
where not exists (select 1 from object_tags ot
inner join tags t on ot.tag_id=t.tag_id
where o.object_id=ot.object_id
and t.tag='animal'
);
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b96e6ab628cb2347838c2e8f253d0475