說Mysql的distinct語(yǔ)句和group by,order by
最近,在做一個(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@]