与其他属性一起显示第一个和最后一个 mysql 记录
Show first and last mysql record in group with other attributes
我想寻求帮助以显示有关在数据库中进行的查询的一些信息。我有一个名为 membervalues
的 table。在这个 table 中,我有 4 个字段 => (id, memberid, submit_datetime, value)。我想根据记录 id
显示每个成员的最大值和最小值 value
。例如,我有以下
id | memberid | submit_datetime | value
------------------------------------------------
1 | 1 | 2018-01-18 09:44:00 | 86
2 | 2 | 2018-01-18 10:32:00 | 95
3 | 3 | 2018-01-18 11:19:00 | 74
4 | 1 | 2018-01-18 17:57:00 | 84
5 | 3 | 2018-01-18 18:31:00 | 96
7 | 1 | 2018-01-19 06:31:00 | 86
8 | 2 | 2018-01-19 07:31:00 | 94
9 | 1 | 2018-01-19 08:31:00 | 87
哪一个查询会 return 以下结果导致 php 循环?
memberid | min_record_value | max_record_value
------------------------------------------------
1 | 86 | 87
2 | 95 | 94
3 | 74 | 96
我可以通过 min(id) 和 max(id) 以及 GROUP BY memberid 获取最小和最大 id,但我无法按照上面的要求弄清楚如何使用它获取记录值。在搜索时我遇到了 mysql - join first and last records by group type? 并尝试选择与
类似的方法
select x2.memberid, x2.value as min_record_value, y2.value as max_record_value
from (select *
from (select memberid, value
from membervalues
order by 1, 2) x1
group by 1) x2
join (select *
from (select memberid, value
from membervalues
order by 1, 2 desc) y1
group by 1) y2 on y2.memberid = x2.memberid
但它 return 两者的第一行值如下。
memberid | min_record_value | max_record_value
------------------------------------------------
1 | 86 | 86
2 | 95 | 95
3 | 74 | 74
任何帮助将不胜感激。谢谢
您可以使用 row_number()
window 函数为每个 memberid
的每个记录分配一个编号,从 1
开始,具体取决于记录的位置当按 submit_datetime
和 id
排序时(解决可能的关系)。一次按升序排列最小值,一次按降序排列最大值。然后,您可以在公共 memeberid
上加入派生的 table 并且该数字和该数字的过滤器为 1
.
SELECT xmi.memberid,
xmi.value min_record_value,
xma.value max_record_value
FROM (SELECT v1.memberid,
v1.value,
row_number() OVER (PARTITION BY v1.memberid
ORDER BY v1.submit_datetime ASC,
v1.id ASC) rn
FROM membervalues v1) xmi
INNER JOIN (SELECT v2.memberid,
v2.value,
row_number() OVER (PARTITION BY v2.memberid
ORDER BY v2.submit_datetime DESC,
v2.id DESC) rn
FROM membervalues v2) xma
ON xma.memberid = xmi.memberid
AND xma.rn = xmi.rn
WHERE xma.rn = 1
AND xmi.rn = 1;
我想寻求帮助以显示有关在数据库中进行的查询的一些信息。我有一个名为 membervalues
的 table。在这个 table 中,我有 4 个字段 => (id, memberid, submit_datetime, value)。我想根据记录 id
显示每个成员的最大值和最小值 value
。例如,我有以下
id | memberid | submit_datetime | value
------------------------------------------------
1 | 1 | 2018-01-18 09:44:00 | 86
2 | 2 | 2018-01-18 10:32:00 | 95
3 | 3 | 2018-01-18 11:19:00 | 74
4 | 1 | 2018-01-18 17:57:00 | 84
5 | 3 | 2018-01-18 18:31:00 | 96
7 | 1 | 2018-01-19 06:31:00 | 86
8 | 2 | 2018-01-19 07:31:00 | 94
9 | 1 | 2018-01-19 08:31:00 | 87
哪一个查询会 return 以下结果导致 php 循环?
memberid | min_record_value | max_record_value
------------------------------------------------
1 | 86 | 87
2 | 95 | 94
3 | 74 | 96
我可以通过 min(id) 和 max(id) 以及 GROUP BY memberid 获取最小和最大 id,但我无法按照上面的要求弄清楚如何使用它获取记录值。在搜索时我遇到了 mysql - join first and last records by group type? 并尝试选择与
类似的方法select x2.memberid, x2.value as min_record_value, y2.value as max_record_value
from (select *
from (select memberid, value
from membervalues
order by 1, 2) x1
group by 1) x2
join (select *
from (select memberid, value
from membervalues
order by 1, 2 desc) y1
group by 1) y2 on y2.memberid = x2.memberid
但它 return 两者的第一行值如下。
memberid | min_record_value | max_record_value
------------------------------------------------
1 | 86 | 86
2 | 95 | 95
3 | 74 | 74
任何帮助将不胜感激。谢谢
您可以使用 row_number()
window 函数为每个 memberid
的每个记录分配一个编号,从 1
开始,具体取决于记录的位置当按 submit_datetime
和 id
排序时(解决可能的关系)。一次按升序排列最小值,一次按降序排列最大值。然后,您可以在公共 memeberid
上加入派生的 table 并且该数字和该数字的过滤器为 1
.
SELECT xmi.memberid,
xmi.value min_record_value,
xma.value max_record_value
FROM (SELECT v1.memberid,
v1.value,
row_number() OVER (PARTITION BY v1.memberid
ORDER BY v1.submit_datetime ASC,
v1.id ASC) rn
FROM membervalues v1) xmi
INNER JOIN (SELECT v2.memberid,
v2.value,
row_number() OVER (PARTITION BY v2.memberid
ORDER BY v2.submit_datetime DESC,
v2.id DESC) rn
FROM membervalues v2) xma
ON xma.memberid = xmi.memberid
AND xma.rn = xmi.rn
WHERE xma.rn = 1
AND xmi.rn = 1;