子查询返回的行数与等效的JOIN不同

时间:2017-04-28 07:54:45

标签: mysql

当我使用子查询或JOIN时,我得到不同的结果。

查询是:

SELECT
    COUNT(*)
FROM
    table2
WHERE
    table2.id NOT IN (
        SELECT fkfield FROM table1
    )

SELECT
    COUNT(*)
FROM
    table2
LEFT JOIN table1 ON table1.fkfield = table2.id
WHERE
    table1.id IS NULL

table1.fkfieldtable2.id)有一个FK约束

第一个查询返回0行,第二个查询返回396行。

我已尝试OPTIMIZE TABLE并导出/导入(使用mysqldump)但没有运气。 引擎 Innodb

提前致谢。

2 个答案:

答案 0 :(得分:0)

左连接并不完全符合您的预期

“LEFT JOIN关键字返回左表(table1)中的所有记录,以及右表(table2)中的匹配记录。如果没有匹配,则结果从右侧为NULL” https://www.w3schools.com/sql/sql_join_left.asp

LEFT JOIN table1 ON table1.fkfield = table2.id

它返回交集和所有table2.id值

所以

SELECT
    COUNT(*)
FROM
    table2
WHERE
    table2.id NOT IN (
        SELECT fkfield FROM table1
    )

仅返回table1和table2的交集

虽然

SELECT
    COUNT(*)
FROM
    table2
LEFT JOIN table1 ON table1.fkfield = table2.id
WHERE
    table1.id IS NULL

返回table1和table2的交集以及table2.id

的所有值

答案 1 :(得分:0)

我想这意味着你的第二个查询中有一些匹配,其中table1_id为null。尝试通过addng sum检查(table1_id为null,然后为1,否则为0结束时),选择