2013-05-09 81 views
2

我有一个表,我需要从中获取联系人。 因此,我使用一个复杂的查询从我的“短信”表中检索所有联系人。复杂SQL查询JOIN和其中

但是,它应该只计算提供的“imei”字段的记录,但我的查询会一直返回特定联系人的所有计数。

下面是代码是用的,有什么建议吗?

$sql = $this->db->query(' 
    SELECT 
     t1.mnumber AS t1_number, t1.mcontent AS t1_content, t1.mcontact as t1_contact, SUM(t2.TOTAL) AS mTotal 
    FROM 
     sms t1 
      JOIN 
     (SELECT 
      mContent, mcontact, COUNT(mNumber) AS TOTAL, mnumber, MAX(mID) mID 
     FROM 
      sms 
     GROUP BY mContact) t2 ON t1.mcontact = t2.mcontact 
      AND t1.mid = t2.mid 
     WHERE t1.mIMEI = ' . (IMEI) . ' 
     GROUP BY t1.mContact 
     ORDER BY t1.mid DESC'); 

    return $sql->result(); 

谢谢你!!

+4

当没有指定组中的“SELECT”列表中的所有列时,请注意在MySQL中使用“GROUP BY”。你的结果可能是不确定的...... – 2013-05-09 15:24:41

+0

你的'WHERE'子句在内部子查询执行其计数之后被评估**。 – 2013-05-09 15:36:05

回答

2

更好的格式化,查询是:

SELECT t1.mnumber AS t1_number, t1.mcontent AS t1_content, t1.mcontact as t1_contact, SUM(t2.TOTAL) AS mTotal 
FROM sms t1 JOIN 
    (SELECT mContent, mcontact, COUNT(mNumber) AS TOTAL, mnumber, MAX(mID) mID 
     FROM sms 
     GROUP BY mContact 
    ) t2 
    ON t1.mcontact = t2.mcontact AND t1.mid = t2.mid 
WHERE t1.mIMEI = ' . (IMEI) . ' 
GROUP BY t1.mContact 
ORDER BY t1.mid DESC 

的问题是,where条款是放错了地方。为了影响计数,你需要在子查询中使用它。为了影响输出行,您需要在外部查询中使用它。我建议:

SELECT t1.mnumber AS t1_number, t1.mcontent AS t1_content, t1.mcontact as t1_contact, SUM(t2.TOTAL) AS mTotal 
FROM sms t1 JOIN 
    (SELECT mContent, mcontact, COUNT(mNumber) AS TOTAL, mnumber, MAX(mID) as maxmid 
     FROM sms 
     WHERE sms.mIMEI = ' . (IMEI) . ' 
     GROUP BY mContact 
    ) t2 
    ON t1.mcontact = t2.mcontact AND t1.mid = t2.maxmid 
GROUP BY t1.mContact 
ORDER BY t1.mid DESC 

我怀疑可能还有其他的简化,这取决于midmcontact指的是在数据库结构方面。

+0

谢谢,我注意到:)但是,它仍然给我在返回错误的计数。例如,对于IMEI 0123,联系X的计数是12.在一般表中,X的总计数是40.当我执行我的查询时,结果是40而不是12. – 2013-05-09 15:39:38

+0

@SamNapkins:谢谢,但仍然一样问题? – 2013-05-10 01:22:59

0

SELECT语句中都需要WHERE子句。

SELECT t1.mnumber AS t1_number, t1.mcontent AS t1_content, t1.mcontact as t1_contact, SUM(t2.TOTAL) AS mTotal 
FROM sms t1 JOIN 
    (SELECT mContent, mcontact, COUNT(mNumber) AS TOTAL, mnumber, MAX(mID) mID 
     FROM sms 
     WHERE mIMEI = ' . (IMEI) . ' 
     GROUP BY mContact 
    ) t2 
    ON t1.mcontact = t2.mcontact AND t1.mid = t2.mid 
WHERE t1.mIMEI = ' . (IMEI) . ' 
GROUP BY t1.mContact 
ORDER BY t1.mid DESC 

没有在这两个地方的WHERE条款,你将加入匹配mContact的所有记录。即使那些不符合你的t1.mIMEI = ' . (IMEI) . '条件。

0

@Gordon Linoff给出的答案是正确的。 真正的问题在于表格本身。

它存储所有消息,但有时'mNumber'是国际电话号码,有时它是用户将其存储到手机的格式。

因此,当我使用'mNumber'字段加载'mContent'时,它只会给我一个部分结果!

那么仍然在寻找解决方案呢?也许是多个WHERE clausule?