需要解释这个MySQL查询

时间:2010-03-16 10:54:15

标签: mysql

我刚遇到这个数据库查询,并想知道这个查询到底是做什么的。请澄清..

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

3 个答案:

答案 0 :(得分:0)

看起来它会按高,中,低排序优先顺序。

因为如果order by子句只是DESC的优先级,那么它将按字母顺序排列,这将给出

中 低 高

答案 1 :(得分:0)

它基本上列出了表“tablename”中的所有字段,并按优先级High,Medium,Low排序。 所以High出现在列表的第一位,然后是Medium,然后是最终的

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

其中*是表格中的其余字段

答案 2 :(得分:0)

其他人已经解释了id的作用(High先来,然后是Medium,然后是Low)。我只想添加一些关于为什么的话。

原因是MySQL中的比较结果是整数 - 如果是真,则为1,如果为假,则为0。你可以按整数排序,所以这个结构有效。我不确定这会在其他RDBMS上传播。

已添加:好的,更详细的说明。首先,让我们从ORDER BY的工作原理开始。

ORDER BY采用以逗号分隔的参数列表,它对每行进行评估。然后它按这些论点排序。所以,举个例子,我们来看一个经典的例子:

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

在这种情况下,ORDER BY的作用是它在内存中获取完整的结果集,并且对于每一行,它评估ab和{{1的值}}。然后使用一些标准排序算法(例如quicksort)对它进行排序。当需要比较两行以找出哪一行首先出现时,它首先比较两行的c值;如果它们相等,则比较a的值;并且,如果它们也相等,它最终会比较b的值。很简单吧?这也是你会做的。

好的,现在让我们考虑一些比较棘手的事情。拿这个:

c

这基本上是相同的,除了在所有排序之前,ORDER BY占用每一行并计算SELECT * from MyTable ORDER BY a+b, c-d a+b并将结果存储在它为分类创建的不可见列中。然后它只是比较前一种情况下的那些值。实质上,ORDER BY创建一个这样的表:

c-d

然后用最后两列对整个事物进行排序,然后将其丢弃。你甚至不把它们看作是你的结果集。

好的,甚至更怪异的东西:

+-------------------+-----+-----+-----+-----+-------+-------+
| Some columns here |  A  |  B  |  C  |  D  |  A+B  |  C-D  |
+-------------------+-----+-----+-----+-----+-------+-------+
|                   |  1  |  2  |  3  |  4  |   3   |   -1  |
|                   |  8  |  7  |  6  |  5  |   15  |   1   |
|                   | ... | ... | ... | ... |  ...  |  ...  |
+-------------------+-----+-----+-----+-----+-------+-------+

再次 - 在执行排序之前,ORDER BY将遍历每一行,计算表达式SELECT * from MyTable ORDER BY CASE WHEN a=b THEN c ELSE D END 的值并将其存储在不可见的列中。此表达式将始终计算为某个值,否则您将获得异常。然后它只对包含简单值的列进行排序,而不仅仅是一个奇特的公式。

CASE WHEN a=b THEN c ELSE D END

希望你对这部分感到满意​​。如果没有,请重新阅读或询问更多示例。

接下来是布尔表达式。或者更确切地说是布尔类型,对于MySQL来说恰好是一个整数。换句话说,+-------------------+-----+-----+-----+-----+-----------------------------------+ | 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 | | | ... | ... | ... | ... | ... | +-------------------+-----+-----+-----+-----+-----------------------------------+ 将返回0而SELECT 2>3将返回1.就是这样。布尔类型是一个整数。你也可以用它做整数的东西。像SELECT 2<3一样会返回6。

好的,现在让我们把所有这些放在一起。我们来看看你的问题:

SELECT (2<3)+5

ORDER BY会看到如下表:

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

然后按最后三个隐藏的列进行排序。这些列稍后会被丢弃。

现在有意义吗?

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