获取最近3组的所有行

时间:2011-05-25 19:06:54

标签: mysql sql

我用谷歌搜索了一下然后看了但是我找不到任何帮助我的东西。

我有一个工作的MySQL查询,它选择了一些列(有三个表,有两个JOIN语句),我希望在结果集上做一些额外的事情。

我想从3个最近的组中选择所有行。 (我只能假设我必须在该列上使用GROUP BY)我很难清楚地解释这一点,所以我将使用一个例子:

id | group
--------------
1  | 1
2  | 2
3  | 2
4  | 2
5  | 3
6  | 3
7  | 4
8  | 4

当然,为了简单起见,我把它愚蠢了(我当前的查询不包含id列)。

现在我理想的查询会按顺序返回(这是id字段):

8,7,6,5,4,3,2

如果我要添加以下第9个元素:

id | group
--------------
9  | 5

我理想的查询将按顺序返回:

9,8,7,6,5

因为这些是最近3组中的所有行。此外,当两行具有相同的组(并且仍然在结果集中)时,我想将它们排序为另一个字段(我没有包含在我愚蠢的示例中)。

在我的搜索中,我只发现了如何对GROUPS的元素(每个元素的MAX,组元素的AVG等)执行操作,而不是GROUPS本身(按字段排序的前3个组)。

提前感谢您的帮助!

编辑:这是我的真实查询的样子。

SELECT t1.f1, t1.f2, t2.f1, t2.f2, t2.f3, t3.f1, t3.f2, t3.f3, t3.f4
FROM t1 
LEFT JOIN t2 ON t2.f1=t1.f3
LEFT JOIN t3 ON t2.f1=t3.f5
WHERE t1.f4='some_constant' AND t2.f4='some_other_constant'
ORDER BY t1.f2 DESC

2 个答案:

答案 0 :(得分:0)

SELECT `table`.* FROM
(SELECT DISTINCT `group`
FROM `table`
ORDER BY `group` DESC LIMIT 3) t1
INNER JOIN `table` ON `table`.`group` = t1.`group`

子查询应该返回具有最大值的三个组,INNER JOIN将确保不包含没有这些组值的行。


假设t1.f2是您的组列:

SELECT a,b,c,d,e,f,g,h,i
FROM
(
  SELECT t1.f1 as a, t1.f2 as b, t2.f1 as c, t2.f2 as d, t2.f3 as e, t3.f1 as f, t3.f2 as g, t3.f3 as h, t3.f4 as i
  FROM t1 
  LEFT JOIN t2 ON t2.f1=t1.f3
  LEFT JOIN t3 ON t2.f1=t3.f5
  WHERE t1.f4='some_constant' AND t2.f4='some_other_constant'
  ORDER BY t1.f2 DESC
) first_table
INNER JOIN
(
  SELECT DISTINCT `f2`
  FROM `t1`
  ORDER BY `f2` DESC LIMIT 3
) second_table
ON first_table.b = second_table.f2

请注意,根据您的表格结构,这可能效率非常低,但如果没有更多信息,我可以做到最好。

答案 1 :(得分:0)

这种方式怎么样...(我使用groupId而不是'group'

[QUERY] => something like (SELECT id, groupId from tables.....) (your query with 2 joins).

-- with this query you have the last thre groups.
[QUERY2] => SELECT distinct(groupId) as groupId FROM ([QUERY]) ORDER BY groupId DESC LIMIT 0,3

最后你将拥有:

SELECT id, groupId from tables----...... WHERE groupId in ([QUERY2]) order by groupId DESC, id DESC