2010-11-21 8 views
0

Si vous trouverez cette question simple pour le forum - blâmez-le sur moi et je vais m'excuser, parce que je ne suis pas plus qu'un novice à cette questions.MS Access requête sql pour les tables de forum

J'ai ces deux tableaux dans MS Access:

tables et articles de table Commentaires reliés par Comments.parent ID = Items.ID.

je besoin d'une requête qui affiche 10 derniers enregistrements de la table des éléments, chaque enregistrement contenant

Item.id 
Item.title 
Item.text 
Item,date_modified 
count of Comments [if any] for the Item 
last Comments[if any] guestName 
last Comments[if any] date_modified 

Jusqu'à présent, j'ai quelque chose comme ceci:

 
SELECT TOP 10 t4.id, t4.* FROM 
(
SELECT Items.id AS item_id , Items.*, t3.guestName , t3.modified AS comment_date 
,(SELECT count(*) FROM Comments where parentid = Items.id) as comentscount 
FROM Items 
,(SELECT t2.id as commentID, t2.guestName , t2.modified, t2.parentid FROM Comments as t2 ORDER BY t2.modified DESC ) as t3 
WHERE 
(Items.id = t2.parentid AND t3.commentID = (SELECT max(id) FROM Comments where parentid = Items.id)) 
ORDER BY Items.modified DESC 

UNION 

SELECT Items.id AS item_id, Items.* , null AS guestName, null AS comment_date, 
(SELECT count(*) FROM Comments where parentid = Items.id) as comentscount 
FROM Items 
WHERE (SELECT count(*) FROM Comments where parentid = Items.id) = 0 
) AS t4 

bien. Cela fonctionne mais je ne cesse de me demander si cela pourrait être fait de manière plus simple.

Toutes les suggestions seront plus que bienvenues.

Merci d'avance.

+0

Flinsch et remou, merci beaucoup pour vos réactions. J'ai dû faire quelques ajustements mineurs mais les idées générales que vous m'avez envoyées m'ont été très utiles. Les deux exemples m'ont donné la poussée dans la bonne direction pour améliorer mes connaissances sql et j'ai fait fonctionner la requête en douceur. – novice17

Répondre

0
SELECT TOP 10 
Item.id, 
Item.title, 
Item.text, 
Item.modified, 
COUNT(Comment.id) AS count_of_comments, 
(SELECT TOP 1 Comment.guest_name FROM Comment WHERE Comment.parentid = Item.id ORDER BY Comment.modified DESC) AS last_guest_name, 
MAX(Comment.modified) AS last_comment_date 
FROM Item 
LEFT JOIN Comment ON Comment.parentid = Item.id 
GROUP BY Item.id 
ORDER BY Item.modified DESC 

Je ne sais pas si la déclaration SELECT intérieure pourrait également être plus appropriée intégrée. Peut-être que nous pourrions aussi ORDER BY Comments.modified DESC puis simplement "sélectionner" guest_name rejetant l'instruction imbriquée SELECT, mais je ne suis pas sûr.

(je n'ai pas testé.)

+0

Merci Flinsch. Je l'ai obtenu votre exemple de travail comme celui-ci: SELECT TOP 10 Items.id, Items.title, Items.text, Items.modified, COUNT (Comments.id) AS count_of_comments, (SELECT TOP 1 Comments.guest_name FROM Comments WHERE Commentaires.parentid = Items.id ORDER BY Comment.modified DESC) AS last_guest_name, (SELECT TOP 1 Commentaires.modifié FROM Commentaires O WH Comments.parentid = Items.id ORDER BY Commentaires.modified DESC) AS last_comment_date FROM Articles LEFT JOIN Commentaires ON Comments.parentid = Items.id GROUP BY Items.id COMMANDER Éléments.modifiés DESC – novice17

0

Que diriez-vous quelque chose sur les lignes de:

SELECT TOP 10 
     Item.id, 
     Item.title, 
     Item.text, 
     Item.date_modified, 
     c.CommentCount, 
     c.LastComment, 
     c.LastGuestName, 
     c.LastModDate 
FROM Item 
LEFT JOIN 
(SELECT ParentID, 
     Count(ParentID) As CommentCount, 
     Last(Comment) As LastComment, 
     Last(guestName) As LastGuestName, 
     Last(date_modified) As LastModDate 
FROM Comments 
GROUP BY ParentID 
ORDER BY date_modified DESC) c 
ON Item.ItemID=c.ParentID 
ORDER BY item.date_modified 
+0

Merci Remou. Je l'ai obtenu votre exemple de travail comme celui-ci: SELECT TOP 10 Items.id, Items.titel, Items.text, Items.modified , c.commentsCOUNT , c.guest , c.commentDATE À partir des éléments LEFT JOIN (SELECT parentId, Count (parentid) AS commentsCOUNT, DERNIER (nom_invité) en tant qu'invité, DERNIER (modifié) AS commentDATE, DERNIER (Texte) des commentaires GROUP BY ParentID ORDER BY DERNIER (modifié) DESC) c ON Items.Id = c.ParentId COMMANDER items.modified DESC – novice17

Questions connexes