2015-10-27 185 views
0

我有两个表:teremslogs1015
需要从基于类似的“哈希”行logs1015terems添加数据。MySQL左连接空结果

该查询工作正常,如果 'SUM(INSUM)' 或 'SUM(outsum)大于0
但如果logs1015不包含与这些数据' 散列'然后查询结果为空。

什么错误?由于

SELECT terems.*, 
    SUM(insum) as firstsum , 
    SUM(outsum) as secondsum 
    FROM terems 
    LEFT JOIN logs1015 USING(hash) 
    WHERE owner='1' 
     AND (type='stat') 
     AND (time BETWEEN 1445904000 AND 1445990400) 
    GROUP BY name 
    LIMIT 1000 

表结构

*terems*: id(int),hash(varchar),name(varchar),owner(int) 
*logs1015*: id(int),hash(varchar),type(varchar),insum(int),outsum(int),time(varchar) 
+3

你的表格结构是什么?从'logs1015'找到' – Alex

+0

'是'owner','type'还是'time'?如果是这样,那么您还需要检查空值以匹配不存在的行。 – vhu

+0

编辑您的问题并包含*限定的列名*(以便标识表名)。 –

回答

1

当(左)外侧连接,你必须把where子句外部表的连接条件,否则,你说,它必须加入后存在。然后你隐式地把它变成一个内部连接。

也可以在桌面上使用别名,以便您轻松发现这些错误。

例子:

SELECT t.name, 
    SUM(l.insum) as firstsum , 
    SUM(l.outsum) as secondsum 
FROM terems t 
LEFT JOIN logs1015 l ON t.hash = l.hash 
        AND (l.type='stat') 
WHERE t.owner='1' 
    AND (t.time BETWEEN 1445904000 AND 1445990400) 
GROUP BY t.name 
LIMIT 1000 
+0

刚刚添加表结构的主题。 您的查询与我的查询结果相同。 – 966p

0

工作的解决方案:

"SELECT t.*, 
     SUM(l.insum) as firstsum , 
     SUM(l.outsum) as secondsum 
     FROM terems t 
     LEFT JOIN logs1015 l ON 
      t.hash = l.hash 
      AND (l.type='stat') 
      AND (l.time BETWEEN $fromstamp AND $tostamp) 
     WHERE t.owner='$userid'  
     GROUP BY t.name 
     LIMIT 1000"; 

非常感谢!