【问题标题】:Grouping By column and sort by分组依据列和排序依据
【发布时间】:2022-01-24 17:03:27
【问题描述】:

假设我们有 2 张桌子

@Table
export class Parent extends Model {
 @PrimaryKey
 @HasMany(() => child, { as: 'child', foreignKey: 'PARENT_ID' })
 @Column
 ID: number
 @Column
 NAME: string
 ....
}

@Table
export class Child extends Model{
 @PrimaryKey
 @Column
 ID: number
 @Column
 NAME: string
 @PrimaryKey
 @BelongsTo(()=>Parent,{ as: 'parent', targetKey: 'ID', foreignKey: 'PARENT_ID' })
 @Column
 PARENT_ID: number
 @Column
 DOB: Date
.....
}

这是表格数据

 ___________  ______________________________________
| PARENTS   || CHILDRENS                            |
| ID NAME   ||  ID  NAME    PARENT_ID   DOB         |
| 1 David   ||  1   Oscar   1   2018-05-12 06:28:52 |
| 2 John    ||  2   Zac     2   2018-08-25 10:48:34 |
| 3 Steve   ||  3   Greg    1   2019-03-15 16:58:22 |
|           ||  4   Samuel  3   2019-12-16 23:12:34 |
|           ||  5   James   2   2020-03-25 08:48:52 |
|           ||  6   Dan     1   2021-01-05 16:48:12 |
|___________||  7   Kelly   3   2021-07-19 14:25:54 |
             |  8   Gary    1   2021-11-10 14:23:12 |
             |______________________________________|

我希望结果是

 ___________________________________________________________________________________
| RESULT                                                                            |
| Parent_ID      Parent_Name         Child_ID        Child_Name      DOB            |
| 1                David                8               Gary    2021-11-10 14:23:12 |
| 3                Steve                7               Kelly   2021-07-19 14:25:54 |
| 2                John                 5               James   2020-03-25 08:48:52 |
|___________________________________________________________________________________|

我更喜欢 Sequelize 中的答案,但即使是对 SQL 的原始查询也会很好,因为我对此非常坚持。

这只是一个小规模的例子,但实际上有成千上万的父母和数十万的孩子,所以我也对结果进行了分页。所以性能也很重要:)

【问题讨论】:

  • 为什么输出是 Gary 而不是 Dan?也许是“最后出生的”?
  • @RickJames 如果您按 DOB DESC 排序,您会得到“最后出生的”,但我只希望每个父母都有一个。所以换句话说,每个父母都会收到他最后一个出生的孩子
  • 排序不能解决它——结果集中有 8 行,而不是你想要的 3 行。查看我添加的标签。
  • @RickJames 就是这个问题!
  • 双胞胎呢?或者他们一定有不同的出生时间?

标签: mysql sql sequelize.js sequelize-typescript groupwise-maximum


【解决方案1】:

这会得到一个父母名单,其中包含他们最小孩子的出生日期,然后再次加入孩子 -

WITH parents (id, name) AS (
    SELECT 1, 'David' UNION ALL
    SELECT 2, 'John' UNION ALL
    SELECT 3, 'Steve'
), children (id, name, parent_id, dob) AS (
    SELECT 1, 'Oscar',  1, '2018-05-12 06:28:52' UNION ALL
    SELECT 2, 'Zac',    2, '2018-08-25 10:48:34' UNION ALL
    SELECT 3, 'Greg',   1, '2019-03-15 16:58:22' UNION ALL
    SELECT 4, 'Samuel', 3, '2019-12-16 23:12:34' UNION ALL
    SELECT 5, 'James',  2, '2020-03-25 08:48:52' UNION ALL
    SELECT 6, 'Dan',    1, '2021-01-05 16:48:12' UNION ALL
    SELECT 7, 'Kelly',  3, '2021-07-19 14:25:54' UNION ALL
    SELECT 8, 'Gary',   1, '2021-11-10 14:23:12'
)
SELECT *
FROM (
    SELECT p.*, MAX(c.dob) youngest
    FROM parents p
    JOIN children c
        ON p.id = c.parent_id
    GROUP BY p.id
) y
JOIN children c
    ON y.id = c.parent_id
    AND y.youngest = c.dob

【讨论】:

  • 寻找一个通用的解决方案,正如我所说的,可能有很多父母,甚至更多的孩子,以千计
  • 这有什么不一般的?
  • 你提供了查询中的所有数据,如上所述可能有数千个,而且看起来我的 mysql 版本不支持这个查询(不喜欢 WITH)
  • 不,它们是用来模拟数据的 CTE!您只需删除它们。
  • 我的错,您的查询确实有效!只需要在最后通过 c.dob 添加订单:D
【解决方案2】:
select max(c.dob),other fields from parents p
join childrens c
      on p.parentId = c.parentId
group by c.parentId
order by c.dob desc

试试这个。

【讨论】:

  • 不行,首先它应该是 b p.id = c.parentID 但即使在修复之后我收到(根据示例)史蒂夫 - 塞缪尔,约翰 - 扎克,大卫 - 奥斯卡
【解决方案3】:

尝试运行此查询

SELECT  MAX(child.dob) AS dob, child.*, parent.*
    FROM  parents
    INNER JOIN  child  ON parent.ID = child.PARENT_ID
    GROUP BY  parent.ID
    ORDER BY  dob DESC;

【讨论】:

  • 这将使“only_full_group_by”测试失败。
  • 作为@JohnMathew 的回答,这给了第一个不是最后一个出生的孩子
猜你喜欢
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 2010-09-06
相关资源
最近更新 更多