我的表
SELECT * FROM mail;
+---------------------+---------+---------+---------+---------+---------+
| t | srcuser | srchost | dstuser | dsthost | size |
+---------------------+---------+---------+---------+---------+---------+
| 2014-05-11 10:15:08 | barb | saturn | tricia | mars | 58274 |
| 2014-05-12 12:48:13 | tricia | mars | gene | venus | 194925 |
| 2014-05-12 15:02:49 | phil | mars | phil | saturn | 1048 |
| 2014-05-12 18:59:18 | barb | saturn | tricia | venus | 271 |
| 2014-05-14 09:31:37 | gene | venus | barb | mars | 2291 |
| 2014-05-14 11:52:17 | phil | mars | tricia | saturn | 5781 |
| 2014-05-14 14:42:21 | barb | venus | barb | venus | 98151 |
| 2014-05-14 17:03:01 | tricia | saturn | phil | venus | 2394482 |
| 2014-05-15 07:17:48 | gene | mars | gene | saturn | 3824 |
| 2014-05-15 08:50:57 | phil | venus | phil | venus | 978 |
| 2014-05-15 10:25:52 | gene | mars | tricia | saturn | 998532 |
| 2014-05-15 17:35:31 | gene | saturn | gene | mars | 3856 |
| 2014-05-16 09:00:28 | gene | venus | barb | mars | 613 |
| 2014-05-16 23:04:19 | phil | venus | barb | venus | 10294 |
| 2014-05-19 12:49:23 | phil | mars | tricia | saturn | 873 |
| 2014-05-19 22:21:51 | gene | saturn | gene | venus | 23992 |
+---------------------+---------+---------+---------+---------+---------+
我有这样的查询
SELECT t, srcuser, dstuser, size
-> FROM mail
-> ORDER BY IF(srcuser='phil',0,1), srcuser, dstuser;
将产生
+---------------------+---------+---------+---------+
| t | srcuser | dstuser | size |
+---------------------+---------+---------+---------+
| 2014-05-16 23:04:19 | phil | barb | 10294 |
| 2014-05-12 15:02:49 | phil | phil | 1048 |
| 2014-05-15 08:50:57 | phil | phil | 978 |
| 2014-05-14 11:52:17 | phil | tricia | 5781 |
| 2014-05-19 12:49:23 | phil | tricia | 873 |
| 2014-05-14 14:42:21 | barb | barb | 98151 |
| 2014-05-11 10:15:08 | barb | tricia | 58274 |
| 2014-05-12 18:59:18 | barb | tricia | 271 |
| 2014-05-14 09:31:37 | gene | barb | 2291 |
| 2014-05-16 09:00:28 | gene | barb | 613 |
| 2014-05-15 07:17:48 | gene | gene | 3824 |
| 2014-05-15 17:35:31 | gene | gene | 3856 |
| 2014-05-19 22:21:51 | gene | gene | 23992 |
| 2014-05-15 10:25:52 | gene | tricia | 998532 |
| 2014-05-12 12:48:13 | tricia | gene | 194925 |
| 2014-05-14 17:03:01 | tricia | phil | 2394482 |
+---------------------+---------+---------+---------+
我不明白订单是如何强加的.OK,phil是感兴趣的名字。书上说,假设你想要在发件人/收件人中对邮件表邮件进行排序 订单,但您想先为特定发件人发送邮件。为什么我们使用0,1?
答案 0 :(得分:2)
0小于1,因此“0,1”确保您想要的项目首先出现。对于包含它的ORDER BY,IF语句返回0或1。
答案 1 :(得分:2)
让我们检查以下ORDER BY IF(srcuser='phil',0,1), srcuser, dstuser;
我们知道ORDER BY
做了什么,所以除了说它按照列出的顺序对字段进行排序外,我会忽略它。
IF(srcuser='phil',0,1)
如果用户是'phil',我们将值0分配给临时排序字段,否则我们分配值1.因为这是第一个字段,ORDER BY
默认为升序,如果不是明确说明,我们首先通过该临时领域订购。任何带0的项目都将是第一个(phil' s),任何带有1的项目将在此之后(所有其他项目)。
然后对其他字段进行排序,以便为您提供输出结果集的顺序。
基本上,0,1是帮助创建一个命令来对项目进行排序,否则它们将位于列表中的不同位置。您可以将值更改为2,5
并获得相同的结果。
最终,它实际上是IF(srcuser='phil',x,y)
,x < y
。如果您想更改订单,以便其他字段下降,则您可以ORDER BY IF(srcuser='phil',x,y)... DESC
使用x > y
。
使用0和1的另一个原因是它们是数字,数字更容易对这些字母进行排序(计算)。使用IF(srcuser='phil','a','b')
答案 2 :(得分:1)
MySQL在按字段排序时所做的是,它会尝试按升序对字段值进行排序。
在您的情况下,您需要先使用mail
对srcuser='phil'
进行排序,因此您需要添加一个&#34;虚拟&#34;值得这样做,因为否则mail
将按srcuser
(按名称)排序,因此phil
将排名较低。
它的作用是,它使phil
发送的消息具有较低的值(以便按ASC顺序首先排序)然后分配相同的值({{1} })到其余的条目,以便它们由1
子句的其余部分(ORDER BY
)排序