資料庫 group by查詢出其他字段

2022-06-26 06:48:09 字數 1732 閱讀 6178

create table lsq_test_table (

id varchar(64) not null comment '主鍵',

name varchar(10) comment '姓名',

class varchar(10) comment '班級',

yuwen varchar(10) comment '語文',

shuxue varchar(10) comment '數學',

english varchar(10) comment '英語',

physics varchar(10) comment '物理',

creattime varchar(19) comment '建立時間',

primary key (id),

index idx_name (name)

)engine=innodb default charset=utf8 comment='測試表';

資料庫環境:mysql 5.7.19

解決group by只能查詢特定欄位而不能查詢其他欄位的問題。

現在我的查詢需求是得到name和yuwen去重的結果。

傳統的辦法是採用group by或者distinct關鍵字,看下面:

select name, yuwen from lsqsit.lsq_test_table group by name, yuwen;

select distinct name,yuwen from lsqsit.lsq_test_table ;

這種方式的缺點是無法得到其他欄位的值。

下面有兩種方式可以解決這個缺點:

方法1:使用any_value()字段。

sql如下:

select any_value(id),any_value(name),any_value(yuwen),any_value(english),any_value(shuxue),any_value(physics),any_value(createtime) from lsq_test_table where lsq_test_table.class = "1" group by name, yuwen;

結果:當然了也支援聚合函式查詢

注意:可以對列重新命名。另外,對於重複的記錄預設取第一條,但可以根據實際需求來選擇。

方法2:使用組合查詢。

思路是:①首先根據排重字段name和yuwen進行group by,然後對group by的每個結果去最大id,即max(id);②然後從主表中找到這些id的記錄。

注意:發現重複的記錄取的是di最大的那個。

兩個方法對比:

方法1只會對資料庫查詢一次,而方法2會查詢庫兩次;

方法2中in()函式沒有索引,因此如果你id數量足夠多的話,那麼查詢會很慢;

綜上,推薦方法1!

資料庫group by過濾

查詢歷史記錄的時候,比如1分鐘插入一條記錄,但是這些記錄基本相同,或者某些字段完全相同 我們想顯示在前端的希望過濾掉重複部分或者每隔20分鐘,或者5分鐘顯示一條 declare checktime datetime,intervartime int set checktime 2010 1 1 11...

oracle資料庫GROUP BY 子句

1.group by子句 在select 列表中所有未包含在組函式中的列都應該包含在group by 子句中.如下 select deptno,g sal from emp group by deptno deptno為沒有包含在組函式的列 以下查詢是錯誤的 select a,b,c,g sal f...

MYSQL使用group by,如何查詢出總記錄數

select t.report date t.user id from my table t group by t.user id,t.report date比如有這樣一條sql,根據t.user id,t.report date兩個字段統計 這樣前端頁面能展示資料,但往往需要乙個總記錄數,在有分頁...