限制每个用户的MySQL结果数量

时间:2014-01-29 10:19:46

标签: php mysql sql mysqli

我有一个网站,用户可以在此网站上列出待售商品。网站的正面使用以下SQL显示待售商品。

SELECT * FROM auctions 
WHERE closed = 0 AND suspended = 0 AND starts <= 1390990443
ORDER BY RAND() LIMIT 30

问题在于,一个用户的销售量很大,以至于网站的前端主要是一个用户。我想使用auction.user列将用户显示的项目限制为每个用户五个项目。

我希望有一行可以在一行中执行此操作,如果没有,那么建议或关于在多个查询上构建结果的链接将会受到赞赏。编码语言是PHP。

编辑:数据库结构在这里。 http://pastebin.com/3ua18k4h

4 个答案:

答案 0 :(得分:2)

就个人而言,我会尝试形成一些解决方案,将结果导入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更改为每个用户所需的最大商家信息数。

答案 1 :(得分:1)

你可以通过更大的LIMIT使用MYSQL获得更多结果,然后为用户出售的每件商品创建一个数组,最后每个用户只需要5个项目,因此你只需要使用1个Mysql请求和更多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);
}

P.S:这是伪代码,你应该添加更多关于数组长度的检查......

答案 2 :(得分:1)

对您的问题不是直接的答案,但也许以下就足够了:

选择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查询中,而这不能用你请求的确切查询完成。

答案 3 :(得分:0)

这是值得思考的问题,虽然我很欣赏从这个到公平和可行的解决方案的智力飞跃可能是一个太过分的步骤!...

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 |
+-----------------------+