簡體   English   中英

限制每個用戶的MySQL結果數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM