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 |
我該怎么辦?
編輯:我注意到有些成員不屬于任何團隊.這些成員應包含在結果集中,并為這些字段使用空值.更新問題以反映新信息.
總結
以上是生活随笔為你收集整理的mysql group by自定义_mysql – GROUP BY和自定义顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java ranger rest_使用R
- 下一篇: python入侵数据库数据库_一个简单的