我需要在一个查询中检索消息,其中包含用户名和未读消息数。正在使用的查询是下面的查询,并且检索用户的名称以及剩余的内容以获取未读消息的计数。如何从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';
但我正在努力融入上面给出的组合查询。你能帮帮我吗?
答案 0 :(得分: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
已编辑: - 已添加如果count = null为0,则添加左连接以确保显示结果。
编辑2:将子查询更改为仅计算发送给该用户的未读。
编辑3:根据所需结果更新了第一个查询并添加了第二个查询。这应该可以解决问题。你可能想要第一个。