2017-01-10 3 views
0

J'essaye d'obtenir le dernier message d'un certain fil mais ne peux pas sembler obtenir ma bonne question. Je ne reçois pas le dernier message d'un certain fil.MySQL obtiennent le dernier message (VarChar)

Présentation

J'utilise 3 tables - messages, message_users, message_threads

Tous les messages appartiennent à un certain fil (un peu comme la façon dont les forums et les messages fonctionnent-ils?) Les utilisateurs peuvent ajouter plusieurs utilisateurs à un certain thread, de sorte que plusieurs utilisateurs peuvent s'informer mutuellement dans le même thread.

Structure de la base

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 

Recherche

Ceci est la requête que je utilise, il fonctionne presque, sauf qu'il ne soit pas le dernier ID, ni le dernier message, tout des idées? (Oui, je l'ai regardé et cherché pour les questions précédentes posées au sujet de ce sujet, mais n'a pas été en mesure d'obtenir la requête fixe sur la base des réponses en quelque sorte)

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 

Répondre

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 

Si SQL ci-dessus devient lent, vous peut faire une des opérations suivantes:

1 - ajouter où dans le SQL intérieur jointure pour faire ce résultat plus petit, qui est:

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 - refonte message_thread ajouter calulated co lumns: (last_message_id, LAST_UPDATED) etc

PS - essayez d'éviter les mots-clés MySQL comme noms de colonnes

enter image description here

+0

Merci, je vais essayer notre moment je rentre chez moi, je mettrai à jour si Ça marche. Juste mis à jour la question avec l'information de la table supplémentaire. – user2949138

+0

Génial, ça marche! Est allé avec la solution secondaire, comme le premier oen a donné un résultat de 0.05 secondes et l'autre 0.0009, merci aussi pour la suggestion quand il s'agit de conventions de nom :) – user2949138