mysql left join返回意外的行数

时间:2012-04-27 04:54:20

标签: mysql sql join left-join mysql-num-rows

我有两张桌子

tableA has 41 rows

tableB has 3 rows

我试图通过使用左连接的查询来获取这两个表的总行数,但是我获得了比预期更多的行(123)(44)

查询:

SELECT COUNT(*)
    FROM tableA as u
LEFT JOIN tableB as d
    ON u.uid=d.uid
WHERE
    u.uid=912391178669
    AND
    u.deleted = 0
    AND
    d.deleted=0

表架构:

TABLEA

id | uid |删除

tableB的

id | uid |删除

5 个答案:

答案 0 :(得分:2)

我运行了以下查询它正常工作..你可以检查出来。

SELECT 
  ( SELECT count(*) from table1 where.... )
+ ( SELECT count(*) from table2 where.... )
as total from dual

答案 1 :(得分:1)

我猜你在tableA中有三行,查询中给出了uid。这意味着tableA中的每一行将与tableB中的每一行连接一次,这意味着您将返回41 x 3行或123.

根据您期待的行数,我想知道您是否需要联盟而不是联盟。

Select * from tableA where uid = 912391178669 and deleted = 0

union all

Select * from tableB where uid = 912391178669 and deleted = 0

联合将结合两个查询的结果。连接将在单个查询中组合表格列。

答案 2 :(得分:0)

41*3=123

TableA的每一行都有uid = 912391178669,而tableB的每一行也都有uid,这就是为什么你总共获得123行的原因。使用一些过滤条件来获得所需的结果(如某些AND条件)

如果您可以向我们展示您的表格列,那么可以帮助您。

左连接不会合并两个表的行 TableA左连接TableB将为您提供满足连接条件的表A的所有行。

答案 3 :(得分:0)

SELECT COUNT(*)
FROM tableA as u
LEFT JOIN tableB as d
ON u.uid=d.uid
AND
u.deleted = d.deleted
WHERE
u.uid=912391178669
AND u.deleted = 0

答案 4 :(得分:0)

SELECT SUM(
  (SELECT count(*) from tableA WHERE uid=912391178669)
+ (SELECT count(*) from tableA WHERE uid=912391178669)
 ) as totalRows