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