1

这不是同一个问题:在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

但我承认它是相似的。

我需要选择每人的前 2 行。这些行按收到的年份排序

问题:有可能在同一个月输入了超过 2 个数据(输入的日期为 YYYY-MM)

我带来的查询(在提到的问题之后)卡在一个大循环中。

SELECT *
FROM `table_data` as b
WHERE (
    SELECT count(*) FROM `table_data` as a
        WHERE a.Nom = b.Nom and a.year < b.year
    ) <= 2;

样本数据 :

  A  |   year   |  Nom
---------------------
  b  |  2011-01 | Tim
---------------------
  d  |  2011-01 | Tim
---------------------
  s  |  2011-01 | Tim
---------------------
  a  |  2011-03 | Luc
---------------------
  g  |  2011-01 | Luc
---------------------
  s  |  2011-01 | Luc

应该出口:

  A  |   year   |  Nom
---------------------
  b  |  2011-01 | Tim
---------------------
  d  |  2011-01 | Tim
---------------------
  a  |  2011-03 | Luc
---------------------
  g  |  2011-01 | Luc
4

1 回答 1

1
(
 -- 首先获得一组结果,就好像您只想要每个结果的最新条目一样
 -- 名称 - 来自具有 ORDER BY 的派生表的简单 GROUP BY
  选择 *
  从 (
    选择 *
    来自`table_data`
    ORDER BY `year` DESC
  )`一个`
  按“名称”分组
)
联盟
(
 -- 如果你应用相同的标准,接下来将它与你得到的结果集结合起来
 -- 并另外指定您不想要任何由
 -- 第一次操作
  选择 *
  从 (
    选择 *
    来自`table_data`
    WHERE `id` 不在 (
      选择`id`
      从 (
        选择 *
        来自`table_data`
        ORDER BY `year` DESC
      )`一个`
      按“名称”分组
    )
    ORDER BY `year` DESC
  ) `b`
  按“名称”分组
)
 -- 可选择将排序应用于最终结果
ORDER BY `Nom` DESC, `year` DESC

我确信有一种更短的方法可以做到这一点,但现在我无法终生弄清楚它是什么。不过,这确实有效——假设你有一个主键(你应该这样做)并且它被称为id.

于 2012-06-22T16:11:19.297 回答