[英]SQL - Select max and min rows from one-to-many relationship
I have three tables connected in a following one-to-many relationships: A+B -> one-to-many, B+C -> one-to-many.我有三个表以以下一对多关系连接:A+B -> 一对多,B+C -> 一对多。 For every entry AI want to get all its B entries and two of their connected C entries representing
max(C.created)
and min(C.created)
对于每个条目,AI 都希望获得其所有 B 条目以及它们连接的两个 C 条目,表示
max(C.created)
和min(C.created)
A: A:
+-----+
| id |
+-----+
|0. |
+-----+
B:乙:
+---------------+
| id | A_id |
+---------------+
|1. | 0. |
|2. | 0. |
+---------------+
C: C:
+--------------------------+
| id | B_id | created |
+--------------------------+
|3 | 1 | 2010
|4 | 1 | 2015
|5 | 1 | 2020
|6 | 2 | 2011
|7 | 2 | 2015
|8 | 2 | 2014
+--------------------------+
result:结果:
+--------------------------+
| A_id | C_id | created|
+--------------------------+
|0 | 3 | 2010
|0 | 5 | 2020
|0 | 6 | 2011
|0 | 7 | 2015
+--------------------------+
This is how my failed attempts looks like, I just cannot make it work as I'd like to:这就是我失败的尝试的样子,我只是不能让它像我想的那样工作:
select A.id, C.id, C.created
from A
join B on (A.id = B.A_id)
join (select *
from C
where C.created = (select min(created) from C) or
C.created = (select max(created) from C)
) as foo
on B.id = foo.B_id
Your data looks like c
has a link to b
, not a
.您的数据看起来像
c
具有指向b
的链接,而不是a
。 Assuming this is the case, you can use window functions:假设是这种情况,您可以使用 window 函数:
select a.*, b.*, c.*
from a join
b
on b.a_id = a.id join
(select c.*,
row_number() over (partition by c.b_id order by c.created) as seqnum_asc,
row_number() over (partition by c.b_id order by c.created desc) as seqnum_desc
from c
) c
on b.id = c.b_id and
1 in (seqnum_asc, seqnum_desc);
your query should be你的查询应该是
select A.id, foo.id, foo.created
from A
join B on (A.id = B.A_id)
join (select *
from C
where C.created = (select min(created) from C as C1 where C.B_id=C1.B_id) or
C.created = (select max(created) from C as C1 where C.B_id=C1.B_id)
) as foo
on B.id = foo.B_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.