Я знаю, что этот вопрос задавался много раз, но у меня возникли проблемы с его реализацией. MySQL не моя самая большая сила здесь.
Я создал систему электронной почты для своего сайта, и я хочу, чтобы, когда пользователь просматривает свою папку «Входящие», он видел свои сообщения, однако вместо оригинала он видел последние сведения об отправителе, дате и пользователе для этого конкретного сообщения. отправитель, дата и данные пользователя.
Моя структура таблицы выглядит следующим образом:
Message_Header
-----------------------
messageid INT
type VARCHAR
subject VARCHAR
Message_Recipient
-----------------------
id INT
messageid INT
userid INT
isread ENUM
isspam ENUM
isdelete ENUM
Message_Detail
--------------------
dtlid INT
messageid INT
from_userid INT
hash VARCHAR
type SMALLINT
body TEXT
title VARCHAR
subtitle VARCHAR
content TEXT
thumb VARCHAR
url TEXT
images VARCHAR
time_sent DATETIME
timestamp INT
Я думал, что-то вроде этого будет работать:
select mh.messageid, mh.subject, mh.type, mr.isread, msg_dtl.from_userid, msg_dtl.firstname, msg_dtl.lastname, msg_dtl.gender, msg_dtl.avatar, msg_dtl.hash, msg_dtl.body, msg_dtl.time_sent
from message_header mh
inner join message_recipient mr on mr.messageid = mh.messageid
inner join (
select md.messageid, md.from_userid, u.firstname, u.lastname, u.gender, u.avatar, md.hash, md.body, md.time_sent
from message_detail md
inner join users u on u.userid = md.from_userid
order by md.time_sent desc
limit 1
) as msg_dtl ON mh.messageid = msg_dtl.messageid
where mr.userid = 5
and mr.isspam = '0'
and mr.isdelete = '0'
Но, очевидно, он ограничивает общий запрос только одной строкой!
Я много раз оглядывался по сторонам, и все это вместе, но я боюсь, что это не оптимизировано и станет боровом:
SELECT msg_dtl.type, msg_dtl.subject, msg_dtl.isread, u.firstname, u.lastname, u.gender, u.avatar, md.body, md.timestamp
FROM message_detail md
INNER JOIN users u on u.userid = md.from_userid
INNER JOIN
(
SELECT mr.userid, mh.type, mh.subject, mr.isspam, mr.isdelete, mr.isread, md.messageid, md.body, max(timestamp) as timestamp
FROM message_detail md
inner join message_header mh on mh.messageid = md.messageid
inner join message_recipient mr on mr.messageid = mh.messageid
GROUP BY md.messageid
) as msg_dtl
USING (timestamp, messageid)
where msg_dtl.userid = 5
and msg_dtl.isspam = '0'
and msg_dtl.isdelete = '0'
Буду признателен за любые указатели или кто-то оптимизирует это. если вам нужна дополнительная информация, пожалуйста, дайте мне знать!