Php 在MySQL中查找无法加入的唯一行?
我有两个表格,一个叫做“关键字”;此表仅将关键字存储为唯一的关键字ID以及关键字的文本。另一种称为“键链接”;此表存储将媒体ID链接到关键字ID的行 如果我有一个媒体项,并且我想获取该媒体项的所有关键字,我将使用以下代码: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
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 = ?)