我有一个名为items
的MySQL表,其中包含数千条记录。每条记录都有一个user_id
字段和一个created
(日期时间)字段。
尝试将查询汇总到SELECT
25行,将一串用户ID作为条件传递,并按created DESC
排序。
在某些情况下,可能只有一些用户ID,而在其他情况下,可能有数百个。
如果结果集大于25,我想通过消除重复的user_id
记录来减少它。例如,如果user_id = 3
有两条记录,则只会包含最新的记录(根据created
日期时间)。
在我尝试解决方案时,我遇到了麻烦,例如,虽然很容易得到100的结果集(允许重复的user_id
记录),或者结果集为16(使用{{ 1}}对于唯一的GROUP BY
记录),很难得到25。
一种逻辑方法,可能不是正确的MySQL方法,是为每个user_id
获取每个user_id
的最新记录,然后,如果结果集小于25,则开始添加第二条记录对于每个user_id
,直到达到25个记录限制(可能需要每个user_id
的第三个,第四个等记录。)
这可以通过MySQL查询来完成,还是需要使用大型结果集并使用代码将其减少到25?
答案 0 :(得分:1)
我不认为你想要完成的是SQL查询。无论正常的数据分组是什么,你都希望返回25行,而SQL通常会根据数据分组进行返回。
如果您想要一个纯粹的基于MySQL的解决方案,您可以使用存储过程来完成此任务。 (在MySQL 5.0.x及更高版本中支持。)但是,运行查询以返回所有100多行,然后在应用程序中以编程方式修剪它可能更有意义。
答案 1 :(得分:1)
这将为您提供每个用户的最新信息 -
SELECT user_id,创建
来自项目AS i1
LEFT JOIN项目AS i2
ON i1.user_id = i2.user_id AND i1.create> i2.create
在哪里i2.id IS NULL
他将为您提供每个用户最近的两条记录 -
SELECT user_id,创建
来自项目AS i1
LEFT JOIN项目AS i2
ON i1.user_id = i2.user_id AND i1.create> i2.create
LEFT JOIN项目IS i3 ON i2.user_id = i3.user_id AND i2.create> i3.create
在哪里i3.id IS NULL
尝试从那里开始工作。
你可以很好地把它放到存储过程中。
答案 2 :(得分:1)
我的意见是使用应用程序逻辑,因为这是您尝试在数据库级别实现的非常多的应用程序层逻辑,即过滤结果以使搜索对最终用户更有用。
你可以实现一个存储过程(我个人不会做这样的事情)或只是让应用程序来决定哪两个结果。
答案 3 :(得分:1)
一种方法是从每个用户获取最新项目,然后是来自所有用户的最新项目,并限制该项目。你可以构建病态的例子,这可能不是你想要的,但一般来说应该是相当不错的。
答案 4 :(得分:1)
不幸的是,没有简单的方法:(当我为我的公司制作报告时,我必须做类似的事情,这会导致记录在数据库中的客户禁用。只有问题是断开连接并且每次都记录30分钟。因此,由于时间戳在每个断开连接中都不同,所以行不会是不同的。我用子查询解决了这个问题。我没有确切的代码了,但我相信这是我实现它的方式:
SELECT CORP, HOUSE, CUST,
(
SELECT TOP 1 hsd
FROM #TempTable t2
WHERE t1.corp = t2.corp
AND t1.house = t2.house
AND t1.cust = t2.cust
) DisableDate
FROM #TempTable t1
GROUP BY corp, house, cust -- selecting distinct
所以,我的答案是通过使用子查询从查询中获取非不同列。可能有一种更简单的方法可以做到这一点。我很想知道其他人的帖子。
很抱歉,我一直在编辑这个,我一直在努力想方设法让我更容易展示我的所作所为。