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的記錄。
SELECT id,name,yuwen,shuxue,english,physics,createTime FROM lsq_test_table WHERE id IN(SELECT MAX(id) FROM lsq_test_table where CLASS = "1" GROUP BY NAME, YUWEN)
注意:發現重復的記錄取的是di最大的那個。
兩個方法對比:
方法1只會對數據庫查詢一次,而方法2會查詢庫兩次;
方法2中in()函數沒有索引,因此如果你id數量足夠多的話,那么查詢會很慢;
綜上,推薦方法1!