MySQL – запрос для непрочитанных сообщений вместе с почтовыми сообщениями

Мне нужно получить сообщения в одном запросе с именем пользователей и, кроме того, количество непрочитанных сообщений. Используемый запрос является приведенным ниже, а имя пользователя извлекается, а оставшееся – для получения количества непрочитанных сообщений. Как я могу получить непрочитанные сообщения от 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'; 

Но я изо всех сил стараюсь включить в комбинированный запрос, как указано выше. Не могли бы вы мне помочь?

введите описание изображения здесь

Получено последнее письмо и количество непрочитанных (полученных).

  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 и добавлено левое соединение, чтобы показать результаты.

edit 2: Изменен подзапрос, чтобы считать только непрочитанные сообщения, отправленные этому пользователю.

Редактировать 3: Обновлен 1-й запрос и добавлен 2-й запрос в зависимости от требуемых результатов. Это должно сделать трюк. Вероятно, вы хотите первый.