sql - Displaying messsage in specific format in mysql php -
i have created messaging system users allow users send message another.
for have created 2 tables.
conversation(conversation_id,user_id1,user_id2) messages(message_id,conversation_id,sender_id,receiver_id,message,created_time)
if users talking first time, conversation_id created user_id1(who initiate chat) , user_id2(to user_id1 sending message)
messages table contain info related message.
now want is, create message summary page logged in user can view conversation list between other users order created_time, group conversation_id.
here table data:
conversation_id | user_id1 | user_id2 1 100 103 2 101 103 3 103 102 message_id| conversation_id| sender_id| receiver_id| message | created_time 1 1 100 103 msg 2012-06-08 08:38:57 2 1 103 100 msg b 2012-06-08 08:39:40 3 2 101 103 msg c 2012-06-08 08:40:20 4 3 102 103 msg d 2012-06-08 08:41:10
and here output looking for: lets logged in user id: 103
conversation_id| conversation_with | last_message | created_time 3 102 msg d 2012-06-08 08:41:10 2 101 msg c 2012-06-08 08:40:20 1 100 msg b 2012-06-08 08:39:40
so output ordering created_time, grouping conversation_id , displaying id of user in conversation_with , userid 103 having conversation.
can provide mysql query need output.
this fun one. so, have 3 main things solve.
- alternate
conversation_with
column depending on desired user shows amongst 2 columns. greatest-n-per-group
find recentmessage
.least-n-per-group
find earliest messagecreated_time
.
the first 1 solved querying twice, alternating user_id
column, unioning results, , ordering unioned results created_time
. think can solve 1 query , no unions, works now.
2 , 3 little more involved. here's sql fiddle query: http://sqlfiddle.com/#!2/bf2b7/1
tl;dnr
select * ( select c.conversation_id, c.user_id2 conversation_with, m1.message last_message, m3.created_time conversation c join messages m1 on c.conversation_id = m1.conversation_id left outer join messages m2 on (c.conversation_id = m2.conversation_id , (m1.created_time < m2.created_time or m1.created_time = m2.created_time , m1.message_id < m2.message_id)) join messages m3 on c.conversation_id = m3.conversation_id left outer join messages m4 on (c.conversation_id = m4.conversation_id , (m3.created_time > m4.created_time or m3.created_time = m4.created_time , m3.message_id > m4.message_id)) user_id1 = 103 , m2.message_id null , m4.message_id null union select c.conversation_id, c.user_id1 conversation_with, m1.message last_message, m3.created_time conversation c join messages m1 on c.conversation_id = m1.conversation_id left outer join messages m2 on (c.conversation_id = m2.conversation_id , (m1.created_time < m2.created_time or m1.created_time = m2.created_time , m1.message_id < m2.message_id)) join messages m3 on c.conversation_id = m3.conversation_id left outer join messages m4 on (c.conversation_id = m4.conversation_id , (m3.created_time > m4.created_time or m3.created_time = m4.created_time , m3.message_id > m4.message_id)) user_id2 = 103 , m2.message_id null , m4.message_id null ) conversations order created_time desc
Comments
Post a Comment