我有一个名为items的MySQL表,其中包含成千上万条记录。每条记录都有一个user_id字段和一个created (日期时间)字段。
尝试将一个查询组合到SELECT 25行,将一个用户ids字符串作为条件传递,并按created DESC排序。
在某些情况下,可能只有几个用户ids,而在其他情况下,可能有数百个。
如果结果集大于25,我希望通过消除重复的user_id记录来减少它。例如,如果user_id = 3有两条记录,那么只会包含最近的记录(根据created datetime)。
在我尝试解决方案的过程中,我遇到了麻烦,例如,虽然很容易获得100个结果集(允许重复的user_id记录)或16个结果集(将GROUP BY用于唯一的user_id记录),但很难获得25个结果集。
一种可能不是正确的MySQL方法的逻辑方法是为每个user_id获取每个user_id的最新记录,然后,如果结果集小于25,则开始为每个user_id添加第二个记录,直到达到25个记录的限制(可能需要为每个user_id添加第三个、第四个等记录)。
这可以通过一个MySQL查询来实现吗?或者我是否需要使用一个大的结果集并通过代码将其减少到25个?
发布于 2009-03-25 18:40:22
我不认为您试图完成的SQL查询是可能的。无论正常的数据分组是什么,您都希望返回25行,而SQL通常对基于数据分组的返回非常挑剔。
如果您想要一个纯粹基于MySQL的解决方案,您可以使用一个存储过程来实现。(在MySQL 5.0.x和更高版本中支持。)但是,运行查询以返回所有100+行,然后在应用程序中以编程方式修剪它可能更有意义。
发布于 2009-03-25 18:41:30
这将为您提供每个用户的最新信息--
选择
,user_id,create
以i1形式从项目
左联接项作为i2
在i1.user_id = i2.user_id和i1.create > i2.create上
其中i2.id为空
他会给你每个用户最近的两条记录--
选择
,user_id,create
以i1形式从项目
左联接项作为i2
在i1.user_id = i2.user_id和i1.create > i2.create上
左连接项在i2.user_id = i3.user_id和i2.create > i3.create上为i3
其中i3.id为空
试着从那里开始工作。
您可以很好地将其放入存储过程中。
发布于 2009-03-25 18:42:21
我的观点是使用应用程序逻辑,因为这是您试图在数据库级别实现的非常多的应用层逻辑,即过滤结果以使搜索对最终用户更有用。
您可以实现一个存储过程(就我个人而言,我永远不会做这样的事情),或者让应用程序决定哪25个结果。
https://stackoverflow.com/questions/682874
复制相似问题