首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >半非重复MySQL查询

半非重复MySQL查询
EN

Stack Overflow用户
提问于 2009-03-25 18:29:08
回答 5查看 279关注 0票数 1

我有一个名为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个?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-25 18:40:22

我不认为您试图完成的SQL查询是可能的。无论正常的数据分组是什么,您都希望返回25行,而SQL通常对基于数据分组的返回非常挑剔。

如果您想要一个纯粹基于MySQL的解决方案,您可以使用一个存储过程来实现。(在MySQL 5.0.x和更高版本中支持。)但是,运行查询以返回所有100+行,然后在应用程序中以编程方式修剪它可能更有意义。

票数 1
EN

Stack Overflow用户

发布于 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为空

试着从那里开始工作。

您可以很好地将其放入存储过程中。

票数 1
EN

Stack Overflow用户

发布于 2009-03-25 18:42:21

我的观点是使用应用程序逻辑,因为这是您试图在数据库级别实现的非常多的应用层逻辑,即过滤结果以使搜索对最终用户更有用。

您可以实现一个存储过程(就我个人而言,我永远不会做这样的事情),或者让应用程序决定哪25个结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/682874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档