12
votes

Afficher seulement la date la plus récente de la table MySQL jointe

J'ai 2 tables, une table "document" et une table "Contenu". Ils ressemblent à ceci (simplifié): xxx

pour chaque changement de contenu, un nouvel enregistrement est inséré dans la table "Contenu". De cette façon, il existe une histoire complète de tous les changements. Je voudrais obtenir une liste de tous les documents, le dernier contenu joint. Il devrait renvoyer le DOCID, le DOCTITLE et le dossier de contenu associé avec la plus nouvelle valeur "datation". Mon cerveau me manque en ce moment, comment créerai-je cette jointure?


2 commentaires

Peut-être renommer cette question à quelque chose de plus descriptif comme "Afficher seulement la date la plus récente de la table jointe"?


@Gorgapor: Bon appel, j'ai mis à jour le titre.


5 Réponses :


0
votes

Pourriez-vous ne pas simplement faire une jointure simple, puis commandez-la par date ajoutée et saisissez uniquement le premier enregistrement?

SELECT docTable.docId, docTable.docTitle from docTable
INNER JOIN content ON content.docID = docTable.contentID
WHERE docTable.docId = <some id>
ORDER BY content.dateAdded DESC


2 commentaires

Je pense que vous voulez que la commande soit une descente pour que la version la plus récente soit la plus récente. De plus, si vous ajoutez «Limite 1», vous obtiendrez une seule ligne.


Votre droit sur la commande. Quant à la limite, vous avez également raison, je viens de laisser cela parce que je n'étais pas sûr de la technologie de la base de données. Cette commande peut varier (autant que je sache).



-1
votes

Ceci est une solution de 2 requêtes:

première requête: xxx

seconde requête: xxx


1 commentaires

Cela nécessiterait une requête séparée pour chaque ligne, pas seulement deux requêtes.



-1
votes

Essayez ceci:

document    content     max(dateadded)

A           1           1-1-2009...

B           5           2-1-2009...


5 commentaires

Est-il possible de renvoyer des documents qui n'ont pas encore de documents de contenu associé en modifiant ceci à une jointure extérieure ou qui changera-t-il le comportement? En outre, cela peut-il également renvoyer les champs contentieux et de contenu, les incluses dans la sélection ou la gâcher?


Est-ce mon SQL? Parce que si ce n'est pas le cas, selon la base de données, vous ne pourrez peut-être pas sélectionner quoi que ce soit dans le groupe par clause.


Vous pouvez faire une jointure à gauche, mais vous ne pouvez pas mettre la colonne contentid là-bas.


Cette solution ne "retourne pas ... le dossier de contenu associé" comme demandé.


Cela fonctionne bien si vous souhaitez simplement afficher lorsque chaque document a été mis à jour pour que chaque document a été mis à jour - alors vous pouvez utiliser max (date) , mais il ne garantit pas le contenu d'autres colonnes à partir de la table de contenu.



29
votes

Ceci peut être fait avec une sous-requête:

SELECT d.docID, docTitle, c.dateAdded, c.content
FROM document d LEFT JOIN content c ON c.docID = d.docID
WHERE dateAdded IS NULL
    OR dateAdded = (
        SELECT MAX(dateAdded)
        FROM content c2
        WHERE c2.docID = d.docID
    )


3 commentaires

Merci pour le nom. Chaque fois que j'ai une question SQL, je ne sais jamais quoi Google pour, ce qui rend plus difficile la recherche d'une solution. :)


Cette requête serait-elle fonctionner lorsqu'il n'y a pas de dossier de contenu pour un document? J'aimerais toujours que cela énumère le document et renvoie simplement NULL pour les champs DIREADDED et Content.


J'ajouterais une limite 1 à la sous-requête. Il peut y avoir plus d'un enregistrement avec la même valeur datation dans la table Content . Cela entraînerait une défaillance. MySQL stocke DateTime avec précision uniquement aux secondes, à cela peut vraiment se produire. Une meilleure solution serait de commander par une colonne de commande unique, qu'il s'agisse d'une clé primaire ou d'une colonne arbitraire qui stocke l'ordre des modifications même dans les cas où la La précision DateTime n'est pas suffisante.



4
votes

Utilisation:

   SELECT t.docid, 
          t.docTitle, 
          mc.dateAdded, 
          mc.content
     FROM DOCUMENT t
LEFT JOIN (SELECT c.docid,
                  c.content,
                  MAX(c.dateAdded)
             FROM CONTENT c
         GROUP BY c.docid, c.content) mc ON mc.docid = t.docid 
                                     AND mc.dateadded = t.dateadded


0 commentaires