繁体   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