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;
我在处理 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;