2017-09-01 2 views
2

En mysql j'ai deux tables: Question et Commentary. C'est ce qu'ils ressemblent:Dans mysql, comment rejoindre avec la deuxième table et obtenir la rangée ayant la date la plus récente?

Question: Id, Titre

Commentaire: QuestionID, contenu, créé (champ date)

QuestionID est une clé étrangère ID Question.

J'ai donc un 0 à plusieurs relation entre Question et Commentaire. Autrement dit, une question peut avoir des commentaires 0..n.

Ce que je voudrais faire, c'est montrer toutes les questions avec le commentaire le plus récent (le champ Créé) le cas échéant. Ainsi, s'il n'y a pas de commentaire, la question doit toujours apparaître, mais avec null dans le champ Contenu du commentaire.

Je crois que je l'ai presque fonctionné dans cette requête, sauf qu'il récupère seulement les questions que ont commentaires. Comme mentionné, je voudrais les questions qui ont pas de commentaires ainsi.

select 
    q.Id AS Id, 
    q.Title AS Title, 
    c.Content AS Content 
from question AS q 
left join commentary as c on c.QuestionId = q.Id 
where 
    c.Created = (
     select MAX(created) 
     from commentary 
     where questionid = q.Id 
    ) 

Comment puis-je ajuster le script?

+0

@Barmar: Je pense que vous êtes un peu trop rapide avec le "bouton de duplication". Je ne crois pas que ce soit un doublon de la question à laquelle vous êtes lié. Lorsque nous passons du temps à taper des questions sur stackoverflow, vous pouvez au moins lire attentivement les questions avant de les marquer en double! – brinch

+0

Je pense que c'est un doublon. Il suffit de déplacer 'c.created = (...)' de la clause 'WHERE' à la clause' ON' et cela devrait fonctionner. – Barmar

+0

Voir aussi [cette question] (https://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column?rq=1). Il montre comment écrire une requête qui obtient le commentaire le plus récent pour chaque question, vous pouvez vous joindre à cette requête. – Barmar

Répondre

1

La clause where renvoie uniquement les lignes dont la ligne de commentaire a la date de création maximale qui n'est pas vraie lorsqu'il n'y a aucun enregistrement de commentaire. Vous avez juste besoin d'inclure des lignes où le commentaire ID_ID est nul, ce qui devrait toujours être vrai lorsqu'il n'y a pas de commentaire.

select 
    q.Id AS Id, 
    q.Title AS Title, 
    c.Content AS Content 
from question AS q 
    left join commentary as c on c.QuestionId = q.Id 
where 
    c.Created = (
     select MAX(created) 
     from commentary 
     where questionid = q.Id 
    ) 
    or 
    c.QuestionId is null