2010-11-21 2 views
0

Если вы найдете этот вопрос простым для форума - обвините его в себе, и я извинюсь, потому что я не более чем просто новичок в этом вопросе.MS Access sql query для таблиц форумов

У меня есть эти две таблиц в MS Access:

элементы таблицы и табличные Комментарии соединенных Comments.parent ID = Items.ID.

Мне нужен запрос, который будет отображаться последние 10 записей из таблицы элементов, каждый из записей, содержащих

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 

До сих пор я получил что-то вроде этого:

 
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 

Ну. Он работает, но я все время спрашиваю себя, можно ли это сделать более простым способом.

Любые предложения будут более чем приветствуются.

Заранее спасибо.

+0

Flinsch и Remou, спасибо большое за ваши реакции. Мне пришлось сделать некоторые небольшие корректировки, но общие идеи, которые вы отправляете, были для меня очень полезными. Оба примера дали мне толчок в правильном направлении, чтобы улучшить мои знания sql, и у меня есть запрос, работающий плавно. – novice17

ответ

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 

Я не уверен, если внутренний SELECT заявление также может быть интегрирован более соответствующим образом. Возможно, мы могли бы также ORDER BY Comments.modified DESC, а затем просто «выберите» guest_name, отклонив вложенный оператор SELECT, но я не уверен.

(я не проверял.)

+0

Спасибо, Флинш. Я получил ваш пример работает так: ВЫБРАТЬ TOP 10 Items.id, Items.title, Items.text, Items.modified, COUNT (Comments.id) AS count_of_comments, (SELECT TOP 1 Comments.guest_name FROM Комментарии WHERE Комментарии.parentid = Items.id ORDER BY Комментарий.modified DESC) AS last_guest_name, (SELECT TOP 1 Комментарии.modified FROM Комментарии WHERE Комментарии.parentid = Items.id ORDER BY Comments.modified DESC) AS last_comment_date ОТ Пунктов ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ Комментарии ON Комментарии.parentid = Items.id GROUP BY Items.id ЗАКАЗАТЬ ПО ТОВАРНЫМ ДАННЫМ DESC – novice17

0

Как о чем-то на линиях:

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

Спасибо Remou. Я получил ваш пример работает так: ВЫБЕРИТЕ TOP 10 Items.id, Items.titel, Items.text, Items.modified , c.commentsCOUNT , c.guest , гр.commentDATE от предметов LEFT JOIN (SELECT ParentId, Count (ParentId) А.С. commentsCOUNT, ПОСЛЕДНИЙ (guestName) в качестве гостя, ПОСЛЕДНИЙ (модифицированный) AS commentDATE, ПОСЛЕДНИЙ (текст) ИЗ Комментарии ГРУППА ПО ParentId ORDER BY ПОСЛЕДНИЙ (модифицировано) DESC) c ON Items.Id = c.ParentId ORDER BY items.modified DESC – novice17