Php 在MySQL中查找无法加入的唯一行?

Php 在MySQL中查找无法加入的唯一行?,php,mysql,sql,Php,Mysql,Sql,我有两个表格,一个叫做“关键字”;此表仅将关键字存储为唯一的关键字ID以及关键字的文本。另一种称为“键链接”;此表存储将媒体ID链接到关键字ID的行 如果我有一个媒体项,并且我想获取该媒体项的所有关键字,我将使用以下代码: SELECT keywords.*, keylinks.* FROM keywords LEFT JOIN keylinks ON (keylinks.keyword_id = keywords.keyword_id) WHERE keylinks.m

我有两个表格,一个叫做“关键字”;此表仅将关键字存储为唯一的关键字ID以及关键字的文本。另一种称为“键链接”;此表存储将媒体ID链接到关键字ID的行

如果我有一个媒体项,并且我想获取该媒体项的所有关键字,我将使用以下代码:

   SELECT keywords.*, keylinks.*
     FROM keywords
LEFT JOIN keylinks ON (keylinks.keyword_id = keywords.keyword_id)
    WHERE keylinks.media_id = ?
如果我想做相反的事情呢?
我不想获取与媒体ID匹配的关键字,而是希望获取与媒体ID不匹配的关键字。我将如何做到这一点?我不能简单地使用
WHERE keylinks.media\u id!=
因为这将返回数千行与特定媒体ID不相关的keylink条目,实际上可能是匹配的关键字

SELECT K1.keyword_id 
  FROM keywords AS K1
 WHERE 
   NOT EXISTS (SELECT * 
                 FROM keylinks AS K2 
                WHERE K2.keyword_id = K1.keyword_id 
                  AND K2.media_id = %d);

这将为您提供数据库中没有键链接的所有关键字

至少有三种方法可以做到这一点。ANSI提供了除之外的
,MySQL目前似乎不支持该功能

左连接/左连接为空 带有外部联接的条件的放置是至关重要的-如果在WHERE子句中,则在联接之后应用该条件。如果条件在联接中,则在联接之前应用这些条件

   SELECT k.*
     FROM KEYWORDS k
LEFT JOIN KEYLINKS kl ON kl.keyword_id = k.keyword_id 
                     AND.media_id = ?
    WHERE keylinks.media_id IS NULL
不存在 不在 哪一个表现最好? 这取决于所比较的列是否可以为空(值可以是
NULL

  • ,左连接/为空
是仅在MySQL上最快的方法

  • 既然你有一个关键词,那么你想要一个与关键词不匹配的媒体id?我想你们对我想问的问题有些困惑。。。我不是在寻找所有没有关键链接的关键词。。。我正在寻找所有的关键字,其中没有匹配特定媒体ID的关键链接。我想你们对我想问的问题有点困惑。。。我不是在寻找所有没有关键链接的关键词。。。我正在寻找所有的关键字,其中没有匹配特定媒体ID的关键链接。我想你们对我想问的问题有点困惑。。。我不是在寻找所有没有关键链接的关键词。。。我正在寻找所有没有与特定媒体ID匹配的关键链接的关键字。
    SELECT k.*
      FROM KEYWORDS k
     WHERE NOT EXISTS (SELECT NULL 
                         FROM KEYLINKS kl 
                        WHERE kl.keyword_id = k.keyword_id
                          AND kl.media_id = ?)
    
    SELECT k.*
      FROM KEYWORDS k
     WHERE k.keyword_id NOT IN (SELECT kl.keyword_id
                                  FROM KEYLINKS kl
                                 WHERE kl.media_id = ?)