2013-05-09 46 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?