溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

說Mysql的distinct語(yǔ)句和group by,order by

發(fā)布時(shí)間:2020-08-09 05:42:00 來(lái)源:ITPUB博客 閱讀:149 作者:kendy517 欄目:MySQL數(shù)據(jù)庫(kù)
最近,在做一個(gè)項(xiàng)目的時(shí)候,發(fā)現(xiàn)得出的數(shù)據(jù)于預(yù)料的相差很多,仔細(xì)的研究了一下,發(fā)現(xiàn)問題出在 distinct語(yǔ)句和groupy by,order by
首先,distinct語(yǔ)句,獲得非重復(fù)的(唯一)行記.
grouy by是分組,order by 是排序。

直接看我的例子。

假定我有一個(gè)表f_job,有字段:

select job_id, com_id,job_time from f_job order by job_time desc limit 10; T e:webwebphpfhrtee.txt
+--------+--------+---------------------+
| job_id | com_id | job_time |
+--------+--------+---------------------+
| 5060 | 2205 | 2006-09-29 16:30:11 |
| 4707 | 19084 | 2006-09-29 16:27:55 |
| 4708 | 19084 | 2006-09-29 16:27:55 |
| 4709 | 19084 | 2006-09-29 16:27:55 |
| 4710 | 19084 | 2006-09-29 16:27:55 |
| 4711 | 19084 | 2006-09-29 16:27:55 |
| 4859 | 19084 | 2006-09-29 16:27:55 |
| 4918 | 19084 | 2006-09-29 16:27:55 |
| 5059 | 2205 | 2006-09-29 16:27:22 |
| 4078 | 2715 | 2006-09-29 16:18:36 |
+--------+--------+---------------------+
10 rows in set (0.03 sec)


還有其他字段,不可能影響結(jié)果.此處不列出。

job_id是primary key。 com_id是外鍵,我需要按照時(shí)間來(lái)排序。所以必須使用order by!

你看到了com_id在得出的結(jié)果中不唯一,對(duì),我需要的結(jié)果就是提取com_id唯一的最近10條com_id的記錄,而已。

我就以以前的MSSQL的經(jīng)驗(yàn)寫如下的語(yǔ)句執(zhí)行:

mysql> select distinct( com_id) from f_job order by job_time desc limit 10; T e:webwebphpfhrtee.txt
+--------+
| com_id |
+--------+
| 19084 |
| 2197 |
| 19917 |
| 19580 |
| 19520 |
| 19664 |
| 19397 |
| 19900 |
| 1176 |
| 19449 |
+--------+


對(duì),這次得出的結(jié)果是唯一,但是,這不對(duì)呀,很明顯,把com_id記錄號(hào)碼是2005的記錄給沒了,這結(jié)果肯定錯(cuò)。馬上分析一下所有的的結(jié)果,發(fā)現(xiàn)忽略的com_id并沒有消失,只是被排到后面去了。

我按照時(shí)間排序,應(yīng)該出現(xiàn)的結(jié)果第一個(gè)就是2205呀,為什么能排到后面?從兩條可疑記錄看出了結(jié)果:

原記錄:

| 5058 | 19580 | 2006-09-29 15:23:58 |
| 5057 | 19917 | 2006-09-29 15:14:16 |
| 4973 | 19580 | 2006-09-29 15:13:49 |
| 5011 | 19580 | 2006-09-29 15:13:49 |

distinct后的次序:


| 19917 |
| 19580 |


這說明,對(duì)于不是在一起的隔行記錄,如果恰巧隔一行,還可以被order by 比較出來(lái),否則比較出來(lái)的不再真實(shí),這是因?yàn)椋痪彺娴纳洗蔚膐rder by 的臨時(shí)值在客觀上不再有用!還有一種情況,如果記錄連著,也可以被比較出來(lái)。

先是明白了MySql的弱智了。

馬上又執(zhí)行了一下操作,結(jié)果如下:
mysql> select distinct(com_id),job_time from f_job order by job_time desc limit 10;
+--------+---------------------+
| com_id | job_time |
+--------+---------------------+
| 2205 | 2006-09-29 16:30:11 |
| 19084 | 2006-09-29 16:27:55 |
| 2205 | 2006-09-29 16:27:22 |
| 2715 | 2006-09-29 16:18:36 |
| 2197 | 2006-09-29 16:03:16 |
| 19580 | 2006-09-29 15:23:58 |
| 19917 | 2006-09-29 15:14:16 |
| 19580 | 2006-09-29 15:13:49 |
| 19520 | 2006-09-29 10:29:41 |
| 19900 | 2006-09-29 10:16:48 |
+--------+---------------------+
10 rows in set (0.10 sec)


先和這個(gè)比較一下:
mysql> select com_id,job_time from f_job order by job_time desc limit 10; T e:webwebphpfhrtee.txt
+--------+---------------------+
| com_id | job_time |
+--------+---------------------+
| 2205 | 2006-09-29 16:30:11 |
| 19084 | 2006-09-29 16:27:55 |
| 19084 | 2006-09-29 16:27:55 |
| 19084 | 2006-09-29 16:27:55 |
| 19084 | 2006-09-29 16:27:55 |
| 19084 | 2006-09-29 16:27:55 |
| 19084 | 2006-09-29 16:27:55 |
| 19084 | 2006-09-29 16:27:55 |
| 2205 | 2006-09-29 16:27:22 |
| 2715 | 2006-09-29 16:18:36 |
+--------+---------------------+
10 rows in set (0.06 sec)

發(fā)現(xiàn),distinct恰巧和前面第一次測(cè)試的結(jié)果相反處理我們的信息,他把隔行的看作不同的結(jié)果輸出,這就導(dǎo)致了2205的記錄又出現(xiàn)了。

然后我就用了group by語(yǔ)句,應(yīng)該可以吧,結(jié)果也讓我。。。:
mysql> select com_id from f_job group by com_id order by job_time desc limit 10;
+--------+
| com_id |
+--------+
| 19084 |
| 2197 |
| 19917 |
| 19580 |
| 19520 |
| 19664 |
| 19397 |
| 19900 |
| 1176 |
| 19449 |
+--------+
10 rows in set (0.03 sec)


這和distinct的結(jié)果一樣,這倒不出乎意料,然后我又加入分組job_time,看看:
mysql> select com_id from f_job group by com_id,job_time order by job_time desc limit 10;
+--------+
| com_id |
+--------+
| 2205 |
| 19084 |
| 2205 |
| 2715 |
| 2197 |
| 19580 |
| 19917 |
| 19580 |
| 19520 |
| 19900 |
+--------+
10 rows in set (0.03 sec)


這結(jié)果差一點(diǎn)點(diǎn)了,然后我再distinct(com_id)一下,應(yīng)該可以了吧!看看:
mysql> select distinct(com_id) from f_job group by com_id,job_time order by job_time desc limit 10; T e:webwebphpfhrtee.txt
+--------+
| com_id |
+--------+
| 19084 |
| 2197 |
| 19917 |
| 19580 |
| 19520 |
| 19664 |
| 19397 |
| 19900 |
| 1176 |
| 19449 |
+--------+
10 rows in set (0.04 sec)


汗,這和沒加group by 的一點(diǎn)區(qū)別都沒,怎么這樣弱呀!沒辦法,這怎么辦,猶豫中。。。

上面的問題徹底的說明了這樣一個(gè)事實(shí):distinct只能返回它的目標(biāo)字段,而無(wú)法返回其它字段。。。

汗,這和沒加group by 的一點(diǎn)區(qū)別都沒,怎么這樣弱呀!沒辦法,這怎么辦,猶豫中。。。

------------------------------------
想起了一個(gè)很能騷的一個(gè)人--phzzy,這jh,qq說了句話,果然在,他玩php,馬上求助,經(jīng)過1個(gè)多小時(shí)的艱苦YY,終于這鳥人先大爺我一步給出語(yǔ)句:

select (`com_id`),max(`job_time`) from `f_job` GROUP BY `com_id` order by max(`job_time`) limit 10;


mdgb,終于明白了,剛拿到這語(yǔ)句就明白了。

我tmd知道這是2次排序,md,group by是一次,然后無(wú)論怎么樣,都不可能2次排序,因?yàn)榈诙伪仨毥柚鷥?nèi)部的集聚函數(shù)。。。。。。我怎么沒想到max,氣死我了[@more@]
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

gr ct
AI