PDO从表中选择WHERE url!=(SELECT)

时间:2016-01-08 18:04:32

标签: sql pdo

我有2个数据库表 - 一个包含所有条目,另一个是“黑名单” - 表示我想选择除表2的条目之外的所有值

$req = "SELECT * FROM table1 WHERE link_id != (SELECT id FROM table2)";
$stmt = $pdo->query($req);

foreach($stmt as $data) {

echo $data['link_id']."<br>";           

}

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

虽然所选答案有效,但由于数据库需要对内部查询进行两次搜索,然后再对外部查询进行搜索,因此效率不高。最有效和最有效的查询是LEFT JOIN,它不需要第二个查询。

SELECT b.* FROM names AS n LEFT JOIN blacklist_names AS b on n.id=b.id WHERE b.id IS NULL;

你可以像我做的那样对表进行别名。我这样做是为了缩短代码。

查询正在做的是匹配在两个表中找到的所有ID,然后通过从不在黑名单中的“所有名称列表”中留下什么来将它们从结果中排除。

编辑:根据作者的说法,将解决方案放在此处以便从评论中突出显示。

SELECT spotify.ID,spotify.land,spotify.song,spotify.link_id,spotify.pos1 FROM spotify LEFT JOIN spotify_blacklist ON (spotify.link_id = spotify_blacklist.URL) WHERE spotify_blacklist.URL IS NULL ORDER BY spotify.song ASC

答案 1 :(得分:2)

你可以尝试NOT IN,如下:

$req = "SELECT * FROM table1 WHERE link_id NOT IN (SELECT id FROM table2)";

如果我理解正确的话,我认为这会做你所要求的。但这可能不是最快的方法。

相关问题