MySQL JOIN returns 中的条件太多行

MySQL where condition in JOIN returns too many rows

我在处理 SQL 查询时遇到问题。我想将以下 2 个单独工作的查询加入一个查询。

这个查询应该 return 0 这正是我所期望的

SELECT COUNT(*) FROM table3 INNER JOIN table1 ON
    table3.id = table1.id
WHERE table3.somefield = '0' AND table1.field1 = '1' AND table1.field2 = 'something') AS counts

这个查询应该 return 2 这正是我所期望的

SELECT COUNT(*) FROM table3 INNER JOIN table2 ON
    table3.id = table2.id
WHERE table3.somefield = '0' AND table2.field1 = '1' AND table2.field2 = 'something') AS counts

我合并了查询并将条件移动到 JOIN,但这会导致查询计算太多行

SELECT COUNT(*) FROM table3 
    LEFT JOIN table1 ON
        table3.id = table1.id AND (table1.field1 = '1'  AND table1.field2 = 'something')
    LEFT JOIN table2 ON
         table3.id = table2.id AND (table2.field1 = '1' AND table2.field2 = 'something')
WHERE table3.somefield = '0'

我期望的是查询的第一部分,它应该 return 0,第二部分应该是 2,但得到的输出是 148,它必须与 AND 条件有关JOIN.

这里出了什么问题?

在这里找到我的答案

mysql left join returns unexpected amount of rows

SELECT
    (SELECT COUNT(*) FROM table3 INNER JOIN table1 ON
        table3.id = table1.id
    WHERE table3.somefield = '0' AND table1.field1 = '1' AND table1.field2 = 'something') +
    (SELECT COUNT(*) FROM table3 INNER JOIN table2 ON
        table3.id = table2.id
    WHERE table3.somefield = '0' AND table2.field1 = '1' AND table2.field2 = 'something') AS countA,


    (SELECT COUNT(*) FROM table3 INNER JOIN table1 ON
        table3.id = table1.id
    WHERE table3.somefield = '1' AND table1.field1 = '1' AND table1.field2 = 'something') +
    (SELECT COUNT(*) FROM table3 INNER JOIN table2 ON
        table3.id = table2.id
    WHERE table3.somefield = '1' AND table2.field1 = '1' AND table2.field2 = 'something') AS countB

这是怎么回事,您的单个查询使用了 INNER JOIN,而您的组合查询使用了 LEFT JOIN。

您可以通过在 table2 上使用 INNER JOIN 和在 table1 上使用 LEFT JOIN 来修复它:

SELECT * FROM table3 
    INNER JOIN table2 ON
        table3.id = table2.id and table2.field1 = '1' AND table2.field2 = 'something'      
    LEFT JOIN table1 ON
        table3.id = table1.id and table1.field1 = '1'  AND table1.field2 = 'something'
WHERE table3.somefield = '0';

但这要求您在查询运行之前了解您的数据(换句话说,它要求您已经知道 table2 有匹配项而 table1 没有)。这真的不是个好主意。

最好只求 COUNT 的总和:

SELECT SUM(c) as totalCount
FROM (
  SELECT COUNT(*) as c FROM table3 INNER JOIN table1 ON
    table3.id = table1.id
  WHERE table3.somefield = '0' AND table1.field1 = '1' AND table1.field2 = 'something'
  UNION ALL
  SELECT COUNT(*) as c FROM table3 INNER JOIN table2 ON
    table3.id = table2.id
  WHERE table3.somefield = '0' AND table2.field1 = '1' AND table2.field2 = 'something'
) bothCounts;