SELECT FROM table,ORDER BY IF(...)

时间:2017-08-14 08:09:25

标签: mysql

我的表

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?

3 个答案:

答案 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在按字段排序时所做的是,它会尝试按升序对字段值进行排序。

在您的情况下,您需要先使用mailsrcuser='phil'进行排序,因此您需要添加一个&#34;虚拟&#34;值得这样做,因为否则mail将按srcuser(按名称)排序,因此phil将排名较低。

它的作用是,它使phil发送的消息具有较低的值(以便按ASC顺序首先排序)然后分配相同的值({{1} })到其余的条目,以便它们由1子句的其余部分(ORDER BY)排序