国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

說Mysql的distinct語句和group by order by

2024-07-24 12:32:28
字體:
來源:轉載
供稿:網友
        最近,在做一個項目的時候,發現得出的數據于預料的相差很多,仔細的研究了一下,發現問題出在 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)
 
 
還有其他字段,不可能影響結果.此處不列出。
 
job_id是primary key。 com_id是外鍵,我需要按照時間來排序。所以必須使用order by!
 
你看到了com_id在得出的結果中不唯一,對,我需要的結果就是提取com_id唯一的最近10條com_id的記錄,而已。
 
我就以以前的MSSQL的經驗寫如下的語句執行:
 
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 |
+--------+
 
 
對,這次得出的結果是唯一,但是,這不對呀,很明顯,把com_id記錄號碼是2005的記錄給沒了,這結果肯定錯。馬上分析一下所有的的結果,發現忽略的com_id并沒有消失,只是被排到后面去了。
 
我按照時間排序,應該出現的結果第一個就是2205呀,為什么能排到后面?從兩條可疑記錄看出了結果:
 
原記錄:
 
| 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的弱智了。
 
馬上又執行了一下操作,結果如下:
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)
 
發現,distinct恰巧和前面第一次測試的結果相反處理我們的信息,他把隔行的看作不同的結果輸出,這就導致了2205的記錄又出現了。
 
然后我就用了group by語句,應該可以吧,結果也讓我。。。:
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的結果一樣,這倒不出乎意料,然后我又加入分組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)
 
 
這結果差一點點了,然后我再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 的一點區別都沒,怎么這樣弱呀!沒辦法,這怎么辦,猶豫中。。。
 
上面的問題徹底的說明了這樣一個事實:distinct只能返回它的目標字段,而無法返回其它字段。。。
 
汗,這和沒加group by 的一點區別都沒,怎么這樣弱呀!沒辦法,這怎么辦,猶豫中。。。
 
------------------------------------
想起了一個很能騷的一個人--phzzy,這jh,qq說了句話,果然在,他玩php,馬上求助,經過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次排序,因為第二次必須借助內部的集聚函數。 

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临江市| 海口市| 东宁县| 二连浩特市| 怀远县| 崇文区| 梨树县| 青龙| 龙里县| 丹寨县| 普安县| 平乐县| 正镶白旗| 苍溪县| 海安县| 九寨沟县| 大丰市| 常熟市| 洛阳市| 拜泉县| 镇安县| 阳朔县| 新田县| 无极县| 凤台县| 绥化市| 乐清市| 新绛县| 多伦县| 鹤岗市| 如皋市| 瑞金市| 子长县| 郁南县| 新晃| 弥勒县| 清水县| 湾仔区| 玉龙| 大厂| 和田市|