2010-03-16 88 views
0

我只是碰到这种数据库查询来了,不知道究竟该查询d​​oes..Please澄清..需要解释这个MySQL查询

select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC; 
+0

我的扩展描述有帮助吗? –

回答

0

看起来它会通过高,中,然后低位优先。

因为如果order by子句只是优先DESC那就去做字母,这将使

中 低 高

0

它基本上列出了从表“表名”各个领域,并下令按优先级高,中,低。 如此之高首先出现在列表中,然后中,最后低

* High 
* High 
* High 
* Medium 
* Medium 
* Low 

其中*为字段的表中的

0

其他人已经解释做什么ID休息(高先来,然后中,然后低)。我只会补充几句关于为什么就是这样。

原因是MySQL中比较的结果是一个整数 - 如果为真,则为1;如果为假,则为0。你可以用整数进行排序,所以这个结构起作用。但我不确定这是否会在其他RDBMS上飞行。

加:好的,更详细的解释。首先,让我们从ORDER BY的工作原理开始。

ORDER BY需要一个逗号分隔的参数列表,它为每一行评估。然后它按这些论点排序。因此,例如,让我们在经典的例子:

SELECT * from MyTable ORDER BY a, b, c desc 

在这种情况下做什么ORDER BY,是它得到完整的结果在存储器中设置的地方,并为每一行其评估的ab和值c。然后使用一些标准的排序算法(如quicksort)对它进行排序。当它需要比较两行来找出哪一个先到达时,它首先比较两行的值为a;如果相等,则比较b的值;而且,如果这些也是相同的,那么它最后会比较c的值。很简单,对吧?这也是你会做的。

好吧,现在让我们来考虑一些棘手的问题。借此:

SELECT * from MyTable ORDER BY a+b, c-d 

这基本上是同样的事情,不同之处在于所有的分选前,ORDER BY花费的每一行并计算a+bc-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列。

现在有意义吗? (实际上,当然,没有不可见的列,整个事情变得更加棘手以获得良好的速度,使用可能的索引和其他东西,但是更容易理解这样的过程。这也没有错。)

+0

在旁注中,前几天我发现了一个有趣的bug,它必须处理相同的构造。一位开发人员写了'WHERE colA = 15 = colB'试图检查两列是否等于15.这是因为colA = 15等于1,所得比较等同于WHERE colA = 15 AND colB = 1。 。有趣的是 - 这个代码已经运行了**年**,特定的代码每天至少执行一次,但是这个bug在上周才出现。谈论幸运数据! –

+0

谢谢你,但我不舒服的查询.. – Sachindra