获取最近3组的所有行

问题描述

| 我在Google上搜索了一下,但没有找到任何对我有帮助的东西。 我有一个有效的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元素(每个元素的最大值,组元素的AVG等)而不是GROUPS自身(按字段排序的前三个组)执行操作。 预先感谢您的帮助! 编辑:这是我真正的查询
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
    

解决方法

SELECT `table`.* FROM
(SELECT DISTINCT `group`
FROM `table`
ORDER BY `group` DESC LIMIT 3) t1
INNER JOIN `table` ON `table`.`group` = t1.`group`
子查询应返回三个具有最大值的组,“ 4”将确保不包括不包含这些组值的行。 假设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
请注意,根据您的表结构,这可能效率很低,但是如果没有更多信息,这是我能做的最好的事情。     ,这样怎么样...(我用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