如何 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