我運行一個網站,用戶可以發佈項目(例如圖片)。這些項目存儲在MySQL數據庫中。如何在MySQL中爲每個用戶選擇最多3個項目?
我想查詢最近發佈的10個項目,但最多3個項目的約束可以來自任何單個用戶。
是什麼做的最好的方法是什麼?我的首選解決方案是放在請求最後10個項目的SQL查詢上的約束。但是如何設置數據庫設計的想法是非常受歡迎的。
在此先感謝!
BR
我運行一個網站,用戶可以發佈項目(例如圖片)。這些項目存儲在MySQL數據庫中。如何在MySQL中爲每個用戶選擇最多3個項目?
我想查詢最近發佈的10個項目,但最多3個項目的約束可以來自任何單個用戶。
是什麼做的最好的方法是什麼?我的首選解決方案是放在請求最後10個項目的SQL查詢上的約束。但是如何設置數據庫設計的想法是非常受歡迎的。
在此先感謝!
BR
這是一個相關子查詢很簡單:
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
意味着以後添加
相關子查詢是一個強大的工具! :-)
這是困難的,因爲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
)
我首先選擇10個不同的用戶,則選擇來自各那些用戶的圖像與LIMIT 3,可能通過的聯合所有這些,並將其限制爲10.
這將至少將您需要處理的數據縮小到相當數量。
你能用簡單的英語表達它的工作原理嗎?我不明白。 – Tomalak 2008-11-07 14:41:24