按列分组并排序
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
假设我们有 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