2017-01-10 1 views
0

특정 스레드에서 마지막 메시지를 가져 오려고하지만 쿼리를 제대로 처리 할 수 ​​없습니다. 특정 스레드에서 마지막 메시지를 가져 오는 것 같지 않습니다.MySQL이 마지막 메시지 가져 오기 (VarChar)

소개

내가 3 테이블 사용 -, 메시지, message_users를 message_threads

모든 메시지

은 (종류의 포럼 및 게시물의 작동 방식처럼?) 특정 스레드에 속하는 사용자가 다수의 사용자를 추가 할 수 있습니다 특정 스레드로, 그래서 여러 사용자가 동일한 스레드에서 서로 메시지를 보낼 수 있습니다.

데이터베이스 구조

messages table 
    id | t_id | u_id | message | time 
--------+---------+--------+-----------+-------- 
     1 | 1 | 1 | hello! | timestamp 
     2 | 1 | 2 | hi!  | timestamp 
     3 | 2 | 1 | testing | timestamp 


message_threads 
    id | author | subject 
------+---------+----------- 
    1 | 1 | Subject 1 
    2 | 3 | Subject 2 
    3 | 2 | Subject 3 


message_users 
    id | t_id | u_id | read | nonotice 
------+---------+--------+--------+---------- 
    1 | 1 | 1 | 0 | 0 
    2 | 1 | 2 | 0 | 0 
    3 | 2 | 1 | 1 | 0 

쿼리

이 그 어느 쪽도, 마지막 메시지를 마지막으로 ID를 얻을하지 않습니다를 제외하고는 거의 작동, 내가 사용 쿼리이며, 어떤 아이디어? (예, 보니 이전의 질문에 검색 한이 주제에 관한 질문하지만 어떻게 든 응답에 따라 고정 쿼리를 얻을 수 없습니다)

SELECT 
    m2.message, 
    mt.id AS thread_id, 
    max(m.id) AS message_id, 
    max(m.time) AS time, 
    mt.subject 
FROM message_users AS mu 
LEFT JOIN message_threads AS mt ON mt.id = mu.t_id 
LEFT JOIN message AS m ON m.t_id = mt.id 
INNER JOIN (
    select message as messages_text 
    from message group by t_id 
) AS m2 ON m2.id = m.id 
WHERE mu.u_id = 1 AND mu.read = 0 AND mu.nonotice = 0 
GROUP BY mt.id 
ORDER BY m.id DESC 

답변

1
SELECT 
    m.t_id, 
    m.message, 
    m.id AS max_message_id, 
    m.ts AS max_message_ts, 
    t.subject 
FROM messages AS m 
JOIN message_threads AS t ON m.t_id = t.id 
JOIN (
    SELECT t_id, max(id) max_id FROM messages GROUP BY 1 
) AS m2 ON m.id = m2.max_id 
JOIN message_users AS u ON u.t_id = t.id AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0 

SQL가 느려지 위의 경우를 다음 중 하나를 수행 할 수 calulated 공동 추가 message_thread 재 설계 - : -

SELECT 
    m.t_id, 
    m.message, 
    m.id AS max_message_id, 
    m.ts AS max_message_ts, 
    m2.subject 
FROM messages AS m 
JOIN (
    SELECT t.id, max(m.id) AS max_id, t.subject 
    FROM messages AS m 
    JOIN message_threads AS t ON m.t_id = t.id 
    JOIN message_users AS u ON u.t_id = t.id 
    AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0 
    GROUP BY 1 
) AS m2 ON m.id = m2.max_id 

2

1 인, 그 결과는 작게 만들 내부 조인 SQL로 위치를 추가 lumns : (last_message_id는 LAST_UPDATED) 등

PS -

enter image description here

+0

주셔서 감사합니다, 나는 그것을 내가 집에 가서 우리의 순간을 다할 것입니다, 나는 경우 업데이 트됩니다 당신의 열 이름으로 MySQL의 키워드를 피하려고 그것은 작동합니다. 추가 테이블 정보로 질문을 업데이트했습니다. – user2949138

+0

신난다, 작동한다! 첫 번째 oen은 0.05 초의 결과를 주었고 다른 한개는 0.0009 였으므로 보조 솔루션을 사용하여 나왔습니다. 또한 이름 규칙을 사용할 때 제안 해 주신 것에 대해 감사드립니다. :) – user2949138

관련 문제