我只是碰到这种数据库查询来了,不知道究竟该查询does..Please澄清..需要解释这个MySQL查询
select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
我只是碰到这种数据库查询来了,不知道究竟该查询does..Please澄清..需要解释这个MySQL查询
select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
看起来它会通过高,中,然后低位优先。
因为如果order by子句只是优先DESC那就去做字母,这将使
中 低 高
它基本上列出了从表“表名”各个领域,并下令按优先级高,中,低。 如此之高首先出现在列表中,然后中,最后低
即
* High
* High
* High
* Medium
* Medium
* Low
其中*为字段的表中的
其他人已经解释做什么ID休息(高先来,然后中,然后低)。我只会补充几句关于为什么就是这样。
原因是MySQL中比较的结果是一个整数 - 如果为真,则为1;如果为假,则为0。你可以用整数进行排序,所以这个结构起作用。但我不确定这是否会在其他RDBMS上飞行。
加:好的,更详细的解释。首先,让我们从ORDER BY的工作原理开始。
ORDER BY
需要一个逗号分隔的参数列表,它为每一行评估。然后它按这些论点排序。因此,例如,让我们在经典的例子:
SELECT * from MyTable ORDER BY a, b, c desc
在这种情况下做什么ORDER BY
,是它得到完整的结果在存储器中设置的地方,并为每一行其评估的a
,b
和值c
。然后使用一些标准的排序算法(如quicksort)对它进行排序。当它需要比较两行来找出哪一个先到达时,它首先比较两行的值为a
;如果相等,则比较b
的值;而且,如果这些也是相同的,那么它最后会比较c
的值。很简单,对吧?这也是你会做的。
好吧,现在让我们来考虑一些棘手的问题。借此:
SELECT * from MyTable ORDER BY a+b, c-d
这基本上是同样的事情,不同之处在于所有的分选前,ORDER BY花费的每一行并计算a+b
和c-d
并且它只是为了排序产生无形的列存储结果。然后,它只是比较像前一种情况下的那些值。从本质上说,ORDER BY创建这样一个表:
+-------------------+-----+-----+-----+-----+-------+-------+
| Some columns here | A | B | C | D | A+B | C-D |
+-------------------+-----+-----+-----+-----+-------+-------+
| | 1 | 2 | 3 | 4 | 3 | -1 |
| | 8 | 7 | 6 | 5 | 15 | 1 |
| | ... | ... | ... | ... | ... | ... |
+-------------------+-----+-----+-----+-----+-------+-------+
,然后通过最后两列,它后来放弃梳理了整个事情。你甚至不会把它看作你的结果集。
OK,甚至一些怪异:
SELECT * from MyTable ORDER BY CASE WHEN a=b THEN c ELSE D END
再次 - 进行排序之前,ORDER BY会经过的每一行,计算表达式CASE WHEN a=b THEN c ELSE D END
的值,并将其存储在一个看不见的列。这个表达式总是会评估一些值,或者你会得到一个异常。然后它只是按包含简单值的列进行排序,而不仅仅是一个奇特的公式。
+-------------------+-----+-----+-----+-----+-----------------------------------+
| Some columns here | A | B | C | D | CASE WHEN a=b THEN c ELSE D END |
+-------------------+-----+-----+-----+-----+-----------------------------------+
| | 1 | 2 | 3 | 4 | 4 |
| | 3 | 3 | 6 | 5 | 6 |
| | ... | ... | ... | ... | ... |
+-------------------+-----+-----+-----+-----+-----------------------------------+
希望你现在对这部分感到满意。如果不是,请重新阅读或要求更多示例。
接下来是布尔表达式。或者更确切地说,对于MySQL而言,布尔类型恰好是一个整数。换句话说,SELECT 2>3
将返回0,SELECT 2<3
将返回1.仅此而已。布尔类型是一个整数。你也可以用它来做整数。像SELECT (2<3)+5
将返回6.
好吧,现在让我们把所有这些放在一起。让我们把你的查询:
select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
什么情况是,ORDER BY看到一个表像这样:
+-------------------+----------+-----------------+-------------------+----------------+
| Some columns here | priority | priority='High' | priority='Medium' | priority='Low' |
+-------------------+----------+-----------------+-------------------+----------------+
| | Low | 0 | 0 | 1 |
| | High | 1 | 0 | 0 |
| | Medium | 0 | 1 | 0 |
| | Low | 0 | 0 | 1 |
| | High | 1 | 0 | 0 |
| | Low | 0 | 0 | 1 |
| | Medium | 0 | 1 | 0 |
| | High | 1 | 0 | 0 |
| | Medium | 0 | 1 | 0 |
| | Low | 0 | 0 | 1 |
+-------------------+----------+-----------------+-------------------+----------------+
它然后通过各种被废弃后的最后三个invisble列。
现在有意义吗? (实际上,当然,没有不可见的列,整个事情变得更加棘手以获得良好的速度,使用可能的索引和其他东西,但是更容易理解这样的过程。这也没有错。)
在旁注中,前几天我发现了一个有趣的bug,它必须处理相同的构造。一位开发人员写了'WHERE colA = 15 = colB'试图检查两列是否等于15.这是因为colA = 15等于1,所得比较等同于WHERE colA = 15 AND colB = 1。 。有趣的是 - 这个代码已经运行了**年**,特定的代码每天至少执行一次,但是这个bug在上周才出现。谈论幸运数据! –
谢谢你,但我不舒服的查询.. – Sachindra
我的扩展描述有帮助吗? –