2013-11-19 4 views
3

У меня есть две таблицы, messages и thread сообщения - это основная таблица, и нить - это где я держу разговор между двумя пользователями. Я хочу выбрать только из messages таблицу и заказ по thread_id от thread стол. Я использую ниже sql, но он не заказывает, как я хочу.заказывать другой столбец таблицы mysql

Моя цель - установить новое сообщение в таблицу thread, чтобы таблица родительского сообщения в таблице messages отображалась вверху. Кто-нибудь есть идеи?

SELECT m.* 
FROM messages AS m 
    JOIN thread AS t 
      ON t.thread_id = m.id 
WHERE (m.to_user = ? 
    AND m.deleted != ? 
    AND m.del2 != ?) 
    OR 
    (m.from_user = ? 
    AND m.conversation = 'true' 
    AND m.deleted != ? 
    AND m.del2 != ?) 
ORDER BY t.thread_id desc); 

сообщений Столик

id  to_user from_user  message  is_read  deleted  del2 conversation 
---------------------------------------------------------------------------------------- 
1  user1  user2   hi mark,  true       true 
2  user3  user4   wass up yo? true       true 
3  user1  user3   blah blah  

таблица нить

thread_id  thread_to_user thread_from_user  thread_message  thread_message_id thread_is_read 
--------------------------------------------------------------------------------------------------- 

1    user2   user1    hi there,     1   1 
2    user1   user2    hey, wassup     1   1 
3    user2   user1    not much, hw u doin   1   1 
4    user1   user2    doing great and you?   1   0 
5    user3   user4    heyyyy      2   1 
6    user4   user3    hi, u coming?    2   0 

То, что я ожидал, когда вторя строку:

id  to_user from_user  message  is_read  deleted  del2 conversation 
---------------------------------------------------------------------------------------- 
2  user3  user4   wass up yo? true       true 
1  user1  user2   hi mark,  true       true 
3  user1  user3   blah blah  
+0

Чтобы заказать по thread_id, он должен фигурировать в результатах. Итак, просто добавьте его в свой 'SELECT' и он должен сделать так, как ожидалось. –

+0

Третья запись в вашей таблице' Message', которая имеет 'id = 3', с какой записью она связана в вашей таблице' thread'? – Edper

+0

@Edper между этими пользователями не начался разговор, поэтому, когда user1 видит сообщение и отвечает, ответ отправляется в таблицу 'thread', имеющую' thread_message_id = 3' – user3006683

ответ

3

Попробуйте это:

SELECT DISTINCT(id), to_user,from_user, 
message, is_read, conversation 
FROM messages 
LEFT JOIN (
    SELECT thread_id, thread_message_id 
    FROM messages m 
    LEFT JOIN thread t 
    ON m.id = t.thread_message_id 
) tbl 
ON messages.id = tbl.thread_message_id 
ORDER BY tbl.thread_id DESC 

См fiddle demo

Вы можете поместить свой WHERE внутри подзапроса, как:

SELECT DISTINCT(id), to_user,from_user, 
    message, is_read, conversation 
    FROM messages 
    LEFT JOIN (
    SELECT thread_id, thread_message_id 
    FROM messages m 
    LEFT JOIN thread t 
    ON m.id = t.thread_message_id 
    WHERE (m.to_user = ? 
    AND m.deleted != ? 
    AND m.del2 != ?) 
    OR 
    (m.from_user = ? 
    AND m.conversation = true 
    AND m.deleted != ? 
    AND m.del2 != ?) 
) tbl 
    ON messages.id = tbl.thread_message_id 
    ORDER BY tbl.thread_id DESC 

См Fiddle Demo with WHERE

Update (Использование MAX() с подзапроса)

SELECT id, to_user, from_user, message, is_read, conversation 
FROM (
SELECT m.id, max(t.thread_id) thread_id, m.to_user,m.from_user,m.message, m.is_read, m.conversation 
FROM messages m 
LEFT JOIN thread t on(t.thread_message_id = m.id) 
    WHERE (m.to_user = 'user1' 
    AND m.deleted != true 
AND m.del2 != true) 
OR 
(m.from_user = 'user3' 
    AND m.conversation = true 
    AND m.deleted != true 
    AND m.del2 != true) 
GROUP BY m.id 
ORDER BY thread_id desc 
) tbl 

See Other Demo

+0

где я кладу 'WHERE'? – user3006683

+0

@ user3006683 См. Мой обновленный ответ. – Edper

+0

Хорошо, я попробовал ваш ответ, но почему-то он не заказывает его. Даже если я вставляю новую строку в строку, родительская строка, связанная с этим message_id, не входит в верхнюю часть. – user3006683

0

смотрите ниже запрос и скрипку пример

select m.id, max(t.thread_id) thread_id, m.to_user,m.from_user,m.message, m.is_read, m.conversation 
from messages m 
left join thread t on(t.thread_message_id = m.id) 
group by t.thread_message_id 
order by thread_id desc; 

fiddle example

Смежные вопросы