2008-11-07 65 views
11

我運行一個網站,用戶可以發佈項目(例如圖片)。這些項目存儲在MySQL數據庫中。如何在MySQL中爲每個用戶選擇最多3個項目?

我想查詢最近發佈的10個項目,但最多3個項目的約束可以來自任何單個用戶。

是什麼做的最好的方法是什麼?我的首選解決方案是放在請求最後10個項目的SQL查詢上的約束。但是如何設置數據庫設計的想法是非常受歡迎的。

在此先感謝!

BR

回答

5

這是一個相關子查詢很簡單:

SELECT `img`.`id` , `img`.`userid` 
FROM `img` 
WHERE 3 > (
SELECT count(*) 
FROM `img` AS `img1` 
WHERE `img`.`userid` = `img1`.`userid` 
AND `img`.`id` > `img1`.`id`) 
ORDER BY `img`.`id` DESC 
LIMIT 10 

查詢假定較大id意味着以後添加

相關子查詢是一個強大的工具! :-)

+0

你能用簡單的英語表達它的工作原理嗎?我不明白。 – Tomalak 2008-11-07 14:41:24

2

這是困難的,因爲MySQL不支持子查詢的LIMIT子句。如果那樣,這將是非常不重要的......但是,唉,這是我天真的做法:

SELECT 
    i.UserId, 
    i.ImageId 
FROM 
    UserSuppliedImages i 
WHERE 
    /* second valid ImageId */ 
    ImageId = (
    SELECT MAX(ImageId) 
    FROM UserSuppliedImages 
    WHERE UserId = i.UserId 
) 
    OR 
    /* second valid ImageId */ 
    ImageId = (
    SELECT MAX(ImageId) 
    FROM UserSuppliedImages 
    WHERE UserId = i.UserId 
     AND ImageId < (
     SELECT MAX(ImageId) 
     FROM UserSuppliedImages 
     WHERE UserId = i.UserId 
    ) 
    ) 
    /* you get the picture... 
    the more "per user" images you want, the more complex this will get */ 
LIMIT 10; 

你沒上具有優選的結果順序發表意見,所以這個選擇最新的圖像(假設ImageId是遞增自動遞增值)。

爲了比較,SQL Server上的相同的是這樣的:

SELECT TOP 10 
    img.ImageId, 
    img.ImagePath, 
    img.UserId 
FROM 
    UserSuppliedImages img 
WHERE 
    ImageId IN (
    SELECT TOP 3 ImageId 
    FROM UserSuppliedImages 
    WHERE UserId = img.UserId 
) 
0

我首先選擇10個不同的用戶,則選擇來自各那些用戶的圖像與LIMIT 3,可能通過的聯合所有這些,並將其限制爲10.

這將至少將您需要處理的數據縮小到相當數量。

相關問題