2012-04-27 133 views
1

意想不到的量我有2个表,其中MySQL的左连接返回行

tableA has 41 rows 

tableB has 3 rows 

我想使用左连接通过查询来获取这2代表的总行,但我得到比预期更多的方式行(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 |删除

回答

2

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

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

上添加了架构我相信没有SUM()就是正确的。我不确定MySQL是否支持'FROM DUAL',但我确定你可以忽略它。 – 2012-04-27 08:18:58

+0

在mySql中的双重支持 – Addicted 2012-04-27 08:57:43

+0

ohhh ya 其实我是在同一时间尝试两个查询,所以我想我混合起来... 是没有总和也工作... – Addicted 2012-04-27 09:02:43

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 

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

+0

我编辑的查询是这样的:从表A总SELECT COUNT(ID),其中uid = 912391178669和删除= 0 UNION ALL SELECT COUNT(ID)为总从tableB的其中uid = 912391178669和删除= 0,但是当我运行它在phpmyadmin我得到总| 41 | 3当我在脚本中运行它显示只有41返回...我怎么能确保总和? – fxuser 2012-04-27 05:06:39

+0

@fxuser:我认为Jeff的想法是引导你这样做:'SELECT COUNT(*)FROM(/ * UNION查询在这里* /)somealias'。 – 2012-04-27 08:17:42

0
41*3=123 

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

如果您可以向我们显示您的表列,那么它可能可以帮助您。

左连接不合并两个表的行。
TableA左连接TableB会给你所有满足连接条件的表A的行。

+0

我已经在问题 – fxuser 2012-04-27 05:14:23

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 
0
SELECT SUM(
    (SELECT count(*) from tableA WHERE uid=912391178669) 
+ (SELECT count(*) from tableA WHERE uid=912391178669) 
) as totalRows