1. 程式人生 > >SQL left join去重

SQL left join去重

MySQL version: 5.7

這部分可以忽略掉了

-- 一點碎碎念
突然看到上次更新是6月份的事了,兜兜轉轉又是倆月。工作忙不忙看臉上的疙瘩就知道( ╯□╰ )。
被報表虐了一回,正面死磕,現在居然對它有點偏愛~
一直到線上出了個還比較明顯的問題,又累又無奈的說:bye-bye-
最近有很多事情等著自己去做,從來沒有過的感覺。
如果時間可以暫停,我就想停在當下,
可歲月繞過了誰?

使用group by去重

目的:計算每組的總得分,其中is_quit=1的member的得分不記錄在內
  • 對總體結果用group by

    members要過濾掉is_quit=1的資料,用group by group_id可以對group的記錄去重,也可也計算出總分,實現如下

select g.group_id, g.group_name,group_concat(m.member_name) member_names , sum(s.score) sum_score from groups g 
left join members m on g.group_id = m.group_id
left join score s on s.member_id = m.member_id
where m.is_quit = 0 or m.is_quit is null
group by g.group_id
;
  • 對可能重複的表用group by
    但score中一個member有多條記錄,因此可以先對members表以group by計算&去重,再和groups表進行left join
select g.group_id, g.group_name,m.member_names,m.sum_score from groups g 
left join( 
select group_concat(m1.member_name) as member_names,m1.group_id,sum(s.score) sum_score from members m1 
left join score s on s.member_id = m1.member_id
where m1.is_quit=0 or m1.is_quit is null
group by m1.group_id
 ) m on
g.group_id = m.group_id ;

使用distinct去重

目標:列出還有組員的小組
select distinct g.group_id, g.group_name from groups g 
join members m on g.group_id = m.group_id
;

NOTE:distinct用於多個欄位時,需要這些欄位都相同的時候才會達到濾重的目的。如下,由於member_name不盡相同,因此distinct沒有起到想要的效果

select g.group_id, g.group_name, m.member_name from groups g 
join members m on g.group_id = m.group_id
;

參考:
開發老哥哥&實踐出真知

上面例子中用到的資料

-- members的建立語句
CREATE TABLE `members` (
    `member_id` INT(11) NOT NULL COMMENT '成員id',
    `member_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8mb4_unicode_ci',
    `group_id` INT(11) NULL DEFAULT NULL COMMENT '隊id'
)
COMMENT='成員'
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

-- groups的建立語句
CREATE TABLE `groups` (
    `group_id` INT(11) NOT NULL COMMENT '隊id',
    `group_name` VARCHAR(64) NOT NULL COMMENT '隊名稱' COLLATE 'utf8mb4_unicode_ci'
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

-- score的建立語句
CREATE TABLE `score` (
    `member_id` INT(11) NOT NULL COMMENT '成員id',
    `score` INT(11) NOT NULL COMMENT '得分'
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;
alter table `members` add column `is_quit` int(11) null comment '已退出1:是;0:否';

insert into members values (1,'小珩',1,0),(2,'小豪',1,null),(3,'小萌',1,null),(4,'阿峰',2,0),(5,'阿易',2,null),(6,'飛兒',3,null),(7,'花兒',3,,null),(8,'魏魏',null,null);
insert into groups values (1,'水之隊'),(2,'山之隊'),(3,'雲之隊'),(4,'天之隊');
insert into score values (1,0),(2,1),(3,0),(4,0),(5,2),(6,0),(7,1),(2,1),(5,1);