php - 复杂的 SQL 查询 JOIN 和 WHERE

标签 php mysql sql codeigniter join

我有一张 table ,我需要从中获取联系人。因此,我使用复杂的查询来检索“sms”表中的所有联系人。

但是,它应该只计算所提供的“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();

最佳答案

更好的格式,查询是:

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 在数据库结构方面的含义。

关于php - 复杂的 SQL 查询 JOIN 和 WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16465316/

相关文章:

mysql - 在mysql中存储一组数字

sql - 如何获得不同年份的年龄计算

sql - 获取每个subscriber_id 每月的最大(日期)记录。每月不返回重复的 ID

javascript - PHP实时添加动态类别

php - __PHP_Incomplete_Class_Name 错误

mysql - 添加拒绝原因的 SQL 脚本

sql - 如何对 select 生成的表进行查询?

javascript - 如何通过触发第二页的返回来触发方法?

javascript - 使用ajax和codeigniter上传图像文件总是抛出upload_path错误

mysql - 基于另一行的值的不同结果