mysql group by自定义_mysql – GROUP BY和自定义顺序

我已经阅读了

MySQL order by before group by的答案,但是将它应用于我的查询最后会在子查询中找到一个子查询,这是一个相当简单的案例,所以我想知道这是否可以简化:

带有样本数据的模式

为简洁起见,我省略了成员表中的其他字段.此外,在实际应用程序中还有更多表加入,但这些表很容易加入.这是给我问题的membership_stack表.

CREATE TABLE members (

id int unsigned auto_increment,

first_name varchar(255) not null,

PRIMARY KEY(id)

);

INSERT INTO members (id, first_name)

VALUES (1, 'Tyler'),

(2, 'Marissa'),

(3, 'Alex'),

(4, 'Parker');

CREATE TABLE membership_stack (

id int unsigned auto_increment,

member_id int unsigned not null,

sequence int unsigned not null,

team varchar(255) not null,

`status` varchar(255) not null,

PRIMARY KEY(id),

FOREIGN KEY(member_id) REFERENCES members(id)

);

-- Algorithm to determine correct team:

-- 1. Only consider rows with the highest sequence number

-- 2. Order statuses and pick the first one found:

-- (active, completed, cancelled, abandoned)

INSERT INTO membership_stack (member_id, sequence, team, status)

VALUES (1, 1, 'instinct', 'active'),

(1, 1, 'valor', 'abandoned'),

(2, 1, 'valor', 'active'),

(2, 2, 'mystic', 'abandoned'),

(2, 2, 'valor', 'completed'),

(3, 1, 'instinct', 'completed'),

(3, 2, 'valor', 'active');

我无法更改数据库架构,因为数据与外部数据源同步.

询问

这是我到目前为止:

SELECT m.id, m.first_name, ms.sequence, ms.team, ms.status

FROM membership_stack AS ms

JOIN (

SELECT member_id, MAX(sequence) AS sequence

FROM membership_stack

GROUP BY member_id

) AS t1

ON ms.member_id = t1.member_id

AND ms.sequence = t1.sequence

RIGHT JOIN members AS m

ON ms.member_id = m.id

ORDER BY m.id, FIELD(ms.status, 'active', 'completed', 'cancelled', 'abandoned');

这可以按预期工作,但如果他们的“最近序列”涉及多个团队,则成员可能会多次出现.我需要做的是再次在id上聚合并选择每个组中的FIRST行.

然而,这会带来一些问题:

>有no FIRST() function in MySQL

>这整个结果集将成为子表(子查询),这在这里不是什么大问题,但查询在应用程序上非常大.

>它需要与ONLY_FULL_GROUP_BY mode兼容,因为它在MySQL 5.7上默认启用.我没有检查但是我怀疑FIELD(ms.status,’active’,’completed’,’cancel’,’abandoned’)被认为是这个结果集的功能依赖字段.该查询还需要与MySQL 5.1兼容,因为这是我们目前正在运行的.

目标

| id | first_name | sequence | team | status |

|----|------------|----------|----------|-----------|

| 1 | Tyler | 1 | instinct | active |

| 2 | Marissa | 2 | valor | completed |

| 3 | Alex | 2 | valor | active |

| 4 | Parker | NULL | NULL | NULL |

我该怎么办?

编辑:我注意到有些成员不属于任何团队.这些成员应包含在结果集中,并为这些字段使用空值.更新问题以反映新信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SQL中,可以使用ORDER BY子句来对查询结果进行排序。如果你想自定义排序顺序,可以使用一些特殊的方法。 一种方法是使用DESC关键字来对结果进行降序排序,即从大到小排序。例如,你可以使用以下语句来按照nickname升序排序,然后按照id降序排序: SELECT nickname FROM demo ORDER BY nickname, id DESC 另一种方法是使用ORDER BY FIELD()函数来自定义排序顺序。你可以在SQL语句中使用ORDER BY FIELD()语句来定义排序顺序。在这个函数中,你可以指定排序字段和相关值。例如,以下语句可以根据status字段的特定值对结果进行排序: SELECT * FROM demo ORDER BY FIELD(status,3,4,0,2,1) 另外,如果你想找出某一列中的最高值,可以结合使用ORDER BY和LIMIT。以下语句可以找出id列中的最高值: SELECT * FROM demo ORDER BY id DESC LIMIT 1 总结起来,你可以使用DESC关键字来进行降序排序,使用ORDER BY FIELD()函数来自定义排序顺序,以及使用ORDER BY和LIMIT的组合来找出某一列中的最高值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SQL - 使用Order By对数据进行排序](https://blog.csdn.net/weixin_42372660/article/details/120339108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [mysql自定义排序顺序语句](https://download.csdn.net/download/weixin_38638002/14907422)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值