最近,在做一個項目的時候,發(fā)現(xiàn)得出的數(shù)據(jù)于預料的相差很多,仔細的研究了一下,發(fā)現(xiàn)問題出在
distinct語句和groupy by,order by
首先,distinct語句,獲得非重復的(唯一)行記.
grouy by是分組,order by 是排序。
直接看我的例子。
假定我有一個表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是外鍵,我需要按照時間來排序。所以必須使用order by!
你看到了com_id在得出的結(jié)果中不唯一,對,我需要的結(jié)果就是
提取com_id唯一的最近10條com_id的記錄,而已。
我就以以前的MSSQL的經(jīng)驗寫如下的語句執(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 |
+--------+
對,這次得出的結(jié)果是唯一,但是,這不對呀,很明顯,把com_id記錄號碼是2005的記錄給沒了,這結(jié)果肯定錯。馬上分析一下所有的的結(jié)果,發(fā)現(xiàn)忽略的com_id并沒有消失,只是被排到后面去了。
我按照時間排序,應該出現(xiàn)的結(jié)果第一個就是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 |
這說明,對于不是在一起的隔行記錄,如果
恰巧隔一行,還可以被order by 比較出來,否則比較出來的不再真實,這是因為,被緩存的上次的order by 的臨時值在客觀上不再有用!還有一種情況,如果記錄連著,也可以被比較出來。
先是明白了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)
先和這個比較一下:
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恰巧和前面第一次測試的結(jié)果相反處理我們的信息,他把隔行的看作不同的結(jié)果輸出,這就導致了2205的記錄又出現(xiàn)了。
然后我就用了group by語句,應該可以吧,結(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é)果差一點點了,然后我再distinct(com_id)一下,應該可以了吧!看看:
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 的一點區(qū)別都沒,怎么這樣弱呀!沒辦法,這怎么辦,猶豫中。。。
上面的問題徹底的說明了這樣一個事實:
distinct只能返回它的目標字段,而無法返回其它字段。。。
汗,這和沒加group by 的一點區(qū)別都沒,怎么這樣弱呀!沒辦法,這怎么辦,猶豫中。。。
------------------------------------
想起了一個很能騷的一個人--phzzy,這jh,qq說了句話,果然在,他玩php,馬上求助,經(jīng)過1個多小時的艱苦YY,終于這鳥人先大爺我一步給出語句:
select (`com_id`),max(`job_time`) from `f_job` GROUP BY `com_id` order by max(`job_time`) limit 10;
mdgb,終于明白了,剛拿到這語句就明白了。
我tmd知道這是2次排序,md,group by是一次,然后無論怎么樣,都不可能2次排序,因為第二次必須借助內(nèi)部的集聚函數(shù)。。。。。。我怎么沒想到max,氣死我了[@more@]
本文標題:說Mysql的distinct語句和groupby,orderby
路徑分享:
http://weahome.cn/article/ipisii.html