Si vous aviez une table qui vient contenait l'entrée la plus récente pour chaque parent, et l'identifiant du parent, il serait facile, non?
Vous pouvez créer une table de cette manière en rejoignant la table enfant sur elle-même, en ne prenant que la date maximum pour chaque identifiant parent. Quelque chose comme cela (votre dialecte SQL peut varier):
SELECT t1.*
FROM child AS t1
LEFT JOIN child AS t2
ON (t1.parent_id = t2.parent_id and t1.datestamp < t2.datestamp)
WHERE t2.datestamp IS NULL
qui vous fait toutes les lignes de la table des enfants pour qui n'existe timestamp plus, pour cet ID parent. Vous pouvez utiliser cette table dans une sous-requête pour rejoindre à:
SELECT *
FROM parent
JOIN (SELECT t1.*
FROM child AS t1
LEFT JOIN child AS t2
ON (t1.parent_id = t2.parent_id and t1.datestamp < t2.datestamp)
WHERE t2.datestamp IS NULL) AS most_recent_children
ON (parent.id = most_recent_children.parent_id
ou se joindre à la table parent directement en elle:
SELECT parent.*, t1.*
FROM parent
JOIN child AS t1
ON (parent.id = child.parent_id)
LEFT JOIN child AS t2
ON (t1.parent_id = t2.parent_id and t1.datestamp < t2.datestamp)
WHERE t2.datestamp IS NULL
Merci, ça m'a complètement trié. – BenAlabaster
Je suis content de pouvoir le transmettre. – Laramie
Mighty inefficace O (N^2). Consultez la solution ROW_NUMBER pour la complexité O (N). – wqw