2011-07-06 52 views
0

我有兩個表:Mysql的一對多的關係

與IDcomment,IDItem,datePublished和註釋字段IDItem場 表意見表中的項目。

如果我想列出最後10條評論,這是沒有問題的,我只是排序'評論'表。問題是,當我想列出最後十條關於單個項目的評論時,這意味着項目不會重複。

任何最好的方式來實現這一點在使用索引?如果我通過'評論'和IDItem進行排序,我不會收到每個項目的最後評論,因爲該組似乎是隨機訂購的:-(

我找到了將'lastDate'帶到'項目'表,所以我可以通過項目排序,我將有正確的排序順序,但是當我加入評論表時,如果它有10條評論,我會得到10行相同的項目ID :-(

加入一對多的,所以我從左邊的錶帶有一個項目在右表中獲取只有一個項目有道?

我不知道如果我是很清楚的。

+0

您可以發佈您希望獲得什麼輸出的示例嗎? – Jaydee

回答

-1

(Upda特德)這是怎麼回事?

SELECT IDcomment, IDitem from COMMENTS where IDitem in (SELECT DISTINCT(IDitem) FROM comments); 
+0

您不能僅對某些列使用DISTINCT。 – CristiC

+0

更新爲修復原始問題。 –

1

聽起來好像你想要得到10個返回的項目有最近的10條評論,每個條目有一條評論是正確的?

如果是的話,試試這個:

SELECT * FROM Items I 
JOIN 
(SELECT TOP 10 * FROM Comments C2 WHERE DatePublished= 
     (SELECT MAX(DatePublished) FROM Comments C3 WHERE C2.IDItem=C3.IDItem) 
     ORDER BY DatePublished DESC) C1 
ON I.IDItem=C1.IDItem 

編輯:刪除多餘的SELECT和增加的10條評論限制返回

+0

順便說一句,這假設DatePublished是一個時間戳下降到毫秒..如果它是一個簡單的日/月/年的時間戳然後讓我知道,因爲你將需要一個不同的查詢 – roberttdev

0
DECLARE @item TABLE 
(
    IDItem int 
) 
DECLARE @comment TABLE 
(
    IDComment int, 
    DatePublished date, 
    IDItem int, 
    Comment varchar(100) 
) 

INSERT INTO @item (IDItem) VALUES (1); 
INSERT INTO @item (IDItem) VALUES (2); 
INSERT INTO @item (IDItem) VALUES (3); 
INSERT INTO @item (IDItem) VALUES (4); 

INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (1,'2011-01-01', 1, 'test1'); 
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (2,'2011-01-02', 1, 'test2'); 
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (3,'2011-01-01', 2, 'test3'); 
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (4,'2011-01-03', 2, 'test4'); 
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (5,'2011-01-02', 3, 'test5'); 
INSERT INTO @comment (IDComment, DatePublished, IDItem, Comment) VALUES (6,'2011-01-05', 3, 'test6'); 

SELECT i.IDItem, (SELECT TOP 1 c.Comment FROM @comment c WHERE c.IDItem = i.IDItem ORDER BY c.DatePublished) FROM @item i 

退貨

1 test1 
    2 test3 
    3 test5 
    4 NULL 

如果這是你在看什麼因爲,只是mysql這個代碼。將TOP 1替換爲LIMIT 1等。