J'ai 2 tables, une table "document" et une table "Contenu". Ils ressemblent à ceci (simplifié): 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? P> p>
5 Réponses :
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
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).
Ceci est une solution de 2 requêtes:
première requête: p> seconde requête: p>
Cela nécessiterait une requête séparée pour chaque ligne, pas seulement deux requêtes.
Essayez ceci:
document content max(dateadded) A 1 1-1-2009... B 5 2-1-2009...
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) code>, mais il ne garantit pas le contenu d'autres colonnes à partir de la table de contenu.
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
)
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 code> datation code> dans la table code> Content code>. 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.
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
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.