半独特的MySQL查询

时间:2009-03-25 18:29:08

标签: sql mysql

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

5 个答案:

答案 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

所以,我的答案是通过使用子查询从查询​​中获取非不同列。可能有一种更简单的方法可以做到这一点。我很想知道其他人的帖子。

很抱歉,我一直在编辑这个,我一直在努力想方设法让我更容易展示我的所作所为。