说Mysql的独特语句和group by, order by

最近,在做一个项目的时候,发现得出的数据于预料的相差很多,仔细的研究了一下,发现问题出在语句和groupy,按
首先,不同语句,获得非重复的(唯一)行记。由是
grouy分组,命令是排序。

直接看我的例子。

假定我有一个表f_job,有字段:

选择job_id com_id, job_time从f_job order by job_time desc限制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行组(0.03秒)

还有其他字段,不可能影响结果。此处不列出。

job_id是主要key. com_id是外键,我需要按照时间来排序。所以必须使用order by。

你看到了com_id在得出的结果中不唯一,对,我需要的结果就是提取com_id唯一的最近10条com_id的记录,而已。

我就以以前的该软件的经验写如下的语句执行:

mysql>选择不同(com_id) f_job order by job_time desc限制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 |
不同的后的次序:


| 19917 | 19580 |
|

这说明,对于不是在一起的隔行记录,如果恰巧隔一行,还可以被命令比较出来,否则比较出来的不再真实,这是因为,被缓存的上次的命令的临时值在客观上不再有用!还有一种情况,如果记录连着,也可以被比较出来。

先是明白了MySql的弱智了。

马上又执行了一下操作,结果如下:MySql>选择不同(com_id),从f_job秩序job_time job_time desc限制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行组(0.10秒)

先和这个比较一下:
mysql>选择com_id job_time从f_job order by job_time desc限制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行组(0.06秒)
发现,独特的恰巧和前面第一次测试的结果相反处理我们的信息,他把隔行的看作不同的结果输出,这就导致了2205的记录又出现了。

然后我就用了group by语句,应该可以吧,结果也让我……:
mysql>从f_job选择com_id group by com_id order by job_time desc限制10;
+ - - - - - - - - - - +
| com_id |
+ - - - - - - - - - - +

说Mysql的独特语句和group by, order by