mysql - 限制查询之间的行比较

标签 mysql left-join

我将扩展我在 SO 中提出的其他问题,因为问题是不同的。我有两个表:

article_cn:

ID  TITLE      CONTENT       HOME_POSITION
1   article1   blablablabla  1
2   article2   blablablabla  2
3   article3   blablablabla  3
4   article4   blablablabla  4
5   article5   blablablabla  5
6   article6   blablablabla  6
7   article7   blablablabla  7

article_nl:

ID  TITLE    CONTENT        ENGLISH_ID  HOME_POSITION
1   article1 blablablabla   5           1
2   article1 blablablabla   7           2

我执行此查询以获取来自article_en的最新文章,这些文章尚未在article_nl中添加为外键。

SELECT *
FROM article_en
    LEFT JOIN article_nl
        ON article_en.id != article_nl.english_id
ORDER BY article_en.home_position;

这个查询有效,但问题是每个表中有超过 25.000 行,所以查询非常慢(超过 25 秒),所以我想限制这个查询来比较两个表之间的最后 100 篇文章。我的意思是,如果最后 100 篇英文文章中有一些文章未在最后 100 篇荷兰文章中添加为外键。

我尝试了不同的策略:

SELECT *
FROM article_en
    LEFT JOIN article_nl
        ON article_en.id != article_nl.english_id
ORDER BY article_en.home_position DESC limit 100;

它有帮助,但不起作用。也许我必须改变我的策略并尝试使用其他类型的查询而不是使用左连接。

最佳答案

使用子查询可以实现您想要的(比较两个表中的最后 100 个)。

一个例子:

SELECT TOP 100
* FROM
article_en
WHERE article_en.id NOT IN (SELECT english_id FROM article_nl)
ORDER BY home_position

这仍然会有点慢,因为您每次都会与article_nl中的所有english_id进行比较,但应该比您正在做的更快。

如果您只想检查 article_nl 中的 100 篇最新文章,可以通过将子查询更改为 (SELECT TOP 100 english_id FROMarticle_nl) 来实现,但是请注意,这可能会导致误报,因为它只会检查 article_nl

的最新 100 条记录中是否不存在该 id

关于mysql - 限制查询之间的行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46343703/

相关文章:

php - PDO 在 For 循环中插入查询问题

mysql - LEFT OUTER JOIN 返回特定数据

ms-access - 在 Access 查询中的左外连接上为空记录重新调整值

sql-server - SQL Server 中的 LEFT JOIN 与 LEFT OUTER JOIN

mysql - 在mysql中查找多边形或循环上的点的位置

mysql - 字段列表中的未知列 'quantityInStock'(无 PHP)

php - MySQL:从表中获取最后更新ID以将其插入到另一个表中

mysql - 什么时候在mysql中使用外键

带有 COUNT ON LEFT JOIN 的 MySQL 查询

sql - 为什么这个左连接查询无法加载左表中的所有数据?