如何通过多对多关系从SQL提取中排除具有相关关键字的行

时间:2019-06-01 18:54:45

标签: mysql sql

我有一个MySQL数据库,其中有一个media表和一个keywords表,并且mediakeywords之间通过{{ 1}}连接表。

我想从符合以下条件的媒体表中获取所有记录:

media_keywords

从发现的集合中排除以下任何记录:

'description' is like 'dog' OR 
'media.keywords' includes the id for the 'dog' keyword [100]

还排除以下任何行:

'description' is like 'cat' OR
'media.keywords' includes the id for the 'cat' keyword [400]

我也只想返回不同的行,所以我正在使用GROUP BY'media.id'

我目前拥有的SQL语句如下:

'media.keywords' includes the id for the 'monochrome' keyword [500]

这可以正确地提取记录中描述中“ dog”或作为关键字的位置,但完全忽略了排除项。

有人在这里看到我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

我不太会使用mySQL,但是我建议使用另一种方法

  • 在左联接中移动“ DOG”条件(因此仅获取关键字 匹配“ DOG”)并使其成为JOIN。现在,您将拥有所有列表 匹配。
  • 在WHERE子句中添加子查询
  • 不在其中的ID(从...那里选择ID,例如'%cat%')

答案 1 :(得分:0)

我会使用where子句:

select m.*
from media m
where (m.description like '%dog%' or
       exists (select 1
               from keywords k
               where k.media_id = m.id and
                     k.keyword_id = 100
              )
      ) and
      (m.description not like '%cat%' or
       exists (select 1
               from keywords k
               where k.media_id = m.id and
                     k.keyword_id in (400, 500)
              )
       );

这几乎是您条件的直接翻译。