【问题标题】:MySQL - Get x records for every value y in a certain columnMySQL - 为特定列中的每个值 y 获取 x 记录
【发布时间】:2013-06-12 16:04:44
【问题描述】:

我有一张这样的桌子:

列:

id | parent

记录:

1 | 1
2 | 1
3 | 1
4 | 2
5 | 2
6 | 2
7 | 3
8 | 4
9 | 5

对于所有父母,我想获得前 2 条记录,所以我应该:

1 | 1
2 | 1
4 | 2
5 | 2
7 | 3
8 | 4
9 | 5

如何在 MySQL 中实现这一点?我需要使用子查询吗?谢谢。

【问题讨论】:

  • 在 SO:stackoverflow.com/questions/3364224/… 上已经有一个问题和答案。 --- 抱歉,这是针对 MSSQL 的
  • @AartStuurman:这是针对 MSSQL 而不是 MySQL。
  • 你在寻找“独特”
  • @Kyslik:这有什么帮助?
  • 嗯,他也在使用php,不是吗?他可以从数据库中加载所有父母,然后使用 id 数组来选择不同的值。我在玩手机,我可能会弄错(误读、误解),或者顺序相反。

标签: php mysql greatest-n-per-group


【解决方案1】:

试试这个

  SELECT a.id,  a.parent FROM Table1 AS a WHERE 
 (SELECT COUNT(*) FROM Table1 AS b 
 WHERE b.parent = a.parent AND b.id <= a.id) <= 2 
 ORDER BY a.parent ASC, a.id asc

DEMO HERE

 ID     PARENT
 1       1
 2       1
 4       2
 5       2
 7       3
 8       4
 9       5

【讨论】:

    【解决方案2】:

    这里有几个不同的解决方案可供尝试。

    SELECT id, parent
    FROM (
        SELECT id, (@rownum:=IF(parent=@parent, @rownum+1, 1)) AS rownum, 
          (@parent:=parent) AS parent
        FROM (SELECT @parent := null) AS _init
        STRAIGHT_JOIN MyTable
        ORDER BY parent) AS t
    WHERE t.rownum <= 2;
    

    替代方案:

    SELECT t1.id, t1.parent
    FROM MyTable AS t1
    LEFT OUTER JOIN MyTable AS t2
      ON t1.parent = t2.parent AND t1.id >= t2.id
    GROUP BY t1.id
    HAVING COUNT(*) <= 2;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多