【问题标题】:MySQL - Querying for unread messages along with mail messagesMySQL - 查询未读消息和邮件消息
【发布时间】:2015-06-14 14:45:12
【问题描述】:

我需要在一个查询中检索带有用户名和未读消息计数的消息。正在使用的查询是下面的查询,并检索用户的名称以及剩余的内容以获取未读消息的计数。如何从 EMAIL_MESSAGE (MESSAGE_STATUS='U') 获取未读消息到此查询,以便我将信息与其他详细信息一起获取。

SELECT e.MAIL_NO, e.BIZ_ID, e.FROM_ADD, e.TO_ADD, e.EMAIL_SUBJECT,  
      DATE_FORMAT(e.UPDATED_DATE,'%d %b %y, %I:%i %p') AS DATE, e.MAIL_STATUS, 
      CONCAT(ufrom.USER_FIRST_NAME,' ',ufrom.USER_LAST_NAME) AS U_NAME FROM EMAIL e  
LEFT JOIN USER_CONFIG ufrom
     ON ufrom.USER_ID = e.FROM_ADD 
LEFT JOIN USER_CONFIG uto
     ON uto.USER_ID = e.TO_ADD
WHERE 
     e.FROM_ADD=: e.FROM_ADD  
ORDER BY MAX(e.UPDATED_DATE) DESC, ufrom.USER_FIRST_NAME DESC 
LIMIT 0, 10 

表格

CREATE TABLE IF NOT EXISTS USER_CONFIG(
  USER_ID INT UNSIGNED NOT NULL,
  USER_FIRST_NAME VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL, 
  USER_LAST_NAME VARCHAR(100) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL, 
  PRIMARY KEY (USER_ID),
  INDEX idx_USER_CONFIG_id1 (USER_ID ASC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS EMAIL (
 MAIL_NO INT UNSIGNED NOT NULL, 
 BIZ_ID VARCHAR(35) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NOT NULL, 
 FROM_ADD INT UNSIGNED NOT NULL,  -- FOR EMAIL_TYPE EUCP, THIS WILL BE AGENT ID
 TO_ADD INT UNSIGNED DEFAULT NULL, -- FOR EMAIL_TYPE EUCP, THIS WILL BE CANDIDATE_ID
 EMAIL_SUBJECT VARCHAR(75) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' DEFAULT NULL, 
 MAIL_STATUS CHAR(1) CHARACTER SET 'latin1' COLLATE 'latin1_bin' DEFAULT 'A', 
 UPDATED_DATE DATETIME ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (MAIL_NO,BIZ_ID),
 INDEX idx_EMAIL_id1 (FROM_ADD ASC),
 INDEX idx_EMAIL_id2 (TO_ADD ASC),
 INDEX idx_EMAIL_id3 (BIZ_ID ASC),
 INDEX idx_EMAIL_id4 (MAIL_STATUS ASC),
 INDEX idx_EMAIL_id5 (EMAIL_SUBJECT ASC), 
 INDEX idx_EMAIL_id6 (UPDATED_DATE ASC)  
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS EMAIL_MESSAGE (
  MESSAGE_NO INT UNSIGNED NOT NULL, 
  BIZ_ID VARCHAR(35) CHARACTER SET 'latin1' COLLATE 'latin1_bin' NOT NULL, 
  SENDER INT UNSIGNED DEFAULT NULL, 
  MESSAGE TEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' DEFAULT NULL, 
  ATTACHMENT VARCHAR(255) CHARACTER SET 'latin1' COLLATE 'latin1_bin' DEFAULT NULL, 
  MESSAGE_STATUS CHAR(1) CHARACTER SET 'latin1' COLLATE 'latin1_bin' DEFAULT 'U', 
  READ_DATE DATETIME DEFAULT NULL, 
  SEND_DATE DATETIME DEFAULT CURRENT_TIMESTAMP, 
  PRIMARY KEY (MESSAGE_NO,BIZ_ID),
  INDEX idx_EMAIL_MESSAGE_id1 (SENDER ASC),
  INDEX idx_EMAIL_MESSAGE_id2 (MESSAGE_STATUS ASC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;

如果我必须自己查询表,我会使用

SELECT COUNT(*) AS UNREAD_MESSAGE_COUNT FROM EMAIL_MESSAGE 
  WHERE BIZ_ID= :BIZID AND MESSAGE_STATUS = 'U';

但我正在努力合并到上面给出的组合查询中。你能帮我解决这个问题吗?

【问题讨论】:

    标签: php mysql join


    【解决方案1】:

    最后收到的电子邮件和未读的计数(已收到)。

      SELECT e.MAIL_NO, e.BIZ_ID, e.FROM_ADD, e.TO_ADD, e.EMAIL_SUBJECT,  
      DATE_FORMAT(e.UPDATED_DATE,'%d %b %y, %I:%i %p') AS DATE, e.MAIL_STATUS, 
      CONCAT(ufrom.USER_FIRST_NAME,' ',ufrom.USER_LAST_NAME) AS U_NAME,if(UNREAD_MESSAGE_COUNT is null,0,UNREAD_MESSAGE_COUNT) FROM EMAIL e  
    LEFT JOIN USER_CONFIG ufrom
     ON ufrom.USER_ID = e.TO_ADD
    left join (SELECT COUNT(*) AS UNREAD_MESSAGE_COUNT,TO_ADD FROM EMAIL_MESSAGE         inner join EMAIL using (BIZ_ID)
    WHERE MESSAGE_STATUS = 'U' group by TO_ADD) t on t.TO_ADD= e.TO_ADD
    WHERE 
     e.TO_ADD=:TO_ADD
    ORDER BY MAX(e.UPDATED_DATE) DESC, ufrom.USER_FIRST_NAME DESC 
    LIMIT 0, 10 
    

    已发送的电子邮件和未读已发送消息的计数:

      SELECT e.MAIL_NO, e.BIZ_ID, e.FROM_ADD, e.TO_ADD, e.EMAIL_SUBJECT,  
      DATE_FORMAT(e.UPDATED_DATE,'%d %b %y, %I:%i %p') AS DATE, e.MAIL_STATUS, 
      CONCAT(ufrom.USER_FIRST_NAME,' ',ufrom.USER_LAST_NAME) AS U_NAME,if(UNREAD_MESSAGE_COUNT is null,0,UNREAD_MESSAGE_COUNT) FROM EMAIL e  
    LEFT JOIN USER_CONFIG ufrom
     ON ufrom.USER_ID = e.FROM_ADD 
    left join (SELECT COUNT(*) AS UNREAD_MESSAGE_COUNT,FROM_ADD FROM EMAIL_MESSAGE         inner join EMAIL using (BIZ_ID)
    WHERE MESSAGE_STATUS = 'U' group by FROM_ADD) t on t.FROM_ADD= e.FROM_ADD
    WHERE 
     e.FROM_ADD=:FROM_ADD
    ORDER BY MAX(e.UPDATED_DATE) DESC, ufrom.USER_FIRST_NAME DESC 
    LIMIT 0, 10 
    

    已编辑:- 添加 If count=null 为 0,并添加左连接以确保显示结果。

    编辑 2:将子查询更改为仅计算发送给该用户的未读内容。

    编辑 3:根据所需结果更新了第一个查询并添加了第二个查询。这应该可以解决问题。您可能想要第一个。

    【讨论】:

    • 如果 MESSAGE_STATUS 不是 'U' 表示如果邮件已被阅读,则此查询无法返回数据......
    • 对不起,我的意思是如果用户 2 发送了 3 条消息,那么查询返回 finds unread message as 3 for user 2。
    • 哪个字段将 Email_message 表链接到 Email 表 - biz_id?
    • 您在我的第二次编辑后尝试过吗?如果我的表中没有更多数据,就很难准确地测试。
    • 编辑后的查询还考虑(在计数中)用户发送的消息。
    猜你喜欢
    • 2013-06-12
    • 2019-02-07
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2014-08-26
    • 2021-09-05
    • 2013-08-13
    相关资源
    最近更新 更多