我刚遇到这个数据库查询,并想知道这个查询到底是做什么的。请澄清..
select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
答案 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
的作用是它在内存中获取完整的结果集,并且对于每一行,它评估a
,b
和{{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实际上,当然,没有不可见的列,整个事情变得更加棘手,以获得良好的速度,如果可能的话使用索引和其他东西。但是更容易理解这样的过程。它是也没错。)