[英]need explanation for this MySQL query
我刚遇到此数据库查询,想知道此查询的确切作用..请澄清..
select * from tablename order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
看起来它将按高,中,低顺序排列优先级。
因为如果order by子句只是DESC的优先级,那么它将按字母顺序进行,这将给
中低高
它基本上列出了表“ tablename”中的所有字段,并按优先级高,中,低排序。 因此“高”出现在列表中,然后是“中”,最后是“低”
即
* High
* High
* High
* Medium
* Medium
* Low
*是表中其余字段
其他人已经解释了id的作用(首先是高,然后是中,然后是低)。 我只想添加一些关于为什么的话。
原因是在MySQL中比较的结果是一个整数-如果为true,则为1,如果为false,则为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
和cd
并将结果存储在为排序创建的不可见列中。 然后,它只像上一种情况那样比较这些值。 本质上,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 |
| | ... | ... | ... | ... | ... | ... |
+-------------------+-----+-----+-----+-----+-------+-------+
然后按最后两列对整个对象进行排序,然后将其丢弃。 您甚至看不到它们是您的结果集。
好吧,甚至更奇怪的东西:
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
的值, 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 |
+-------------------+----------+-----------------+-------------------+----------------+
然后按最后三个看不见的列进行排序,这些列随后将被丢弃。
现在有意义吗?
(PS当然,实际上,没有不可见的列,并且为了获得良好的速度,整个过程变得非常棘手,如果可能的话,使用索引和其他方法。但是,这样的过程更容易理解。这也没有错)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.