![](/img/trans.png)
[英]Is mysql concurrent connection limit per mysql user or limit per localhost
[英]Limit number of MySQL results per user
我有一個網站,用戶可以在其中列出要出售的物品。 該站點的前面顯示使用以下SQL出售的隨機物品。
SELECT * FROM auctions
WHERE closed = 0 AND suspended = 0 AND starts <= 1390990443
ORDER BY RAND() LIMIT 30
問題在於,一個用戶的銷售量很大,以致網站的前端大部分是該用戶。 我想將用戶使用Auction.user列顯示的項目限制為每個用戶五個項目。
我希望有一行SQL可以做到這一點,如果沒有的話,不勝感激的建議或關於誰在多個查詢上建立結果的鏈接。 編碼語言是PHP。
編輯:數據庫結構在這里。 http://pastebin.com/3ua18k4h
我個人將嘗試形成一些解決方案,將結果提取到PHP中並在其中進行過濾,但這是因為我對PHP的理解比對MySQL的感覺更舒適。 但是,您可以在沒有PHP篩選的情況下僅通過MySQL查詢執行類似的操作,但是不知道它將如何擴展到許多用戶(不確定全表模式,所以我即興使用)
SELECT ID, USERNAME, AUCTION_ID
FROM
(
SELECT *, @row:=IF(username=@username,@row,0)+1 AS auctioncount, @username:=username FROM
(SELECT *,RAND() AS trand FROM table1) t1,
(SELECT @row:=0,@username:='') tm2
ORDER BY username,trand
) t2
WHERE auctioncount<=5 LIMIT 30
SQL提琴: http ://sqlfiddle.com/#!2/ 9bd47/1
您可以將auctioncount
更改為每個用戶想要的最大列表數。
使用更大的LIMIT的MYSQL可以獲得更多結果,然后為每個要出售的商品創建一個數組,最終每個用戶只獲取5項商品,因此您將僅對Mysql使用1個請求,並且CPU使用率更高,這可能是一個好選擇想法,如果您的網站上有很多流量。
1)獲得更多結果:
SELECT * FROM auctions
WHERE closed = 0 AND suspended = 0 AND starts <= 1390990443
ORDER BY RAND() LIMIT 1000
2)循環並存儲每個用戶的每個項目:
foreach($results as $item) {
array_push($itemsPerUser[$item['userId']], $item);
}
3)每個用戶僅過濾5個項目:
foreach($itemsPerUser as $user => $items) {
$fiveItemsPerUser = array_slice($items, 0, 5);
}
PS:這是偽代碼,您應該在數組長度上添加更多檢查等...
並不是您問題的直接答案,但也許以下足夠了:
選擇30個進行拍賣的隨機用戶,並顯示每個拍賣中最早的拍賣:
SELECT * FROM auctions WHERE id IN (
SELECT MIN(id) FROM auctions
WHERE closed = 0 AND suspended = 0 AND starts <= 1390990443
GROUP BY userid ORDER BY RAND() LIMIT 30
)
至少您可以刪除換行符,並將其全部包含在單行sql查詢中,而這不能通過您所請求的確切查詢來完成。
這是值得考慮的事情,盡管我欣賞從此到(公平,可行的)解決方案的智力飛躍可能是太遙不可及了!
SELECT RAND(@i:=RAND()*1000);
+-----------------------+
| RAND(@i:=RAND()*1000) |
+-----------------------+
| 0.7903550134881911 |
+-----------------------+
SELECT RAND(@i);
+--------------------+
| RAND(@i) |
+--------------------+
| 0.7903550134881911 |
+--------------------+
SELECT RAND(@i:=RAND()*1000);
+-----------------------+
| RAND(@i:=RAND()*1000) |
+-----------------------+
| 0.9555754568014065 |
+-----------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.