按列分组并排序

Grouping By column and sort by

假设我们有 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
.....
}

这是 Table 数据

 ___________  ______________________________________
| 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 上的原始查询也很好,因为我对此很困惑。

这只是一个小规模的例子,但实际上有几万 parents 和几十万 children 所以我也对结果进行了分页。所以表现也应该很重要:)

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

试试这个。

尝试 运行 这个查询

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;

这会得到一个 parents 的列表和他们最小的 child 的 dob,然后再次加入 children -

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