繁体   English   中英

需要对此MySQL查询的解释

[英]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所做的就是将完整的结果集存储在内存中的某个位置,并且它针对每一行评估abc的值。 然后使用某种标准排序算法(例如quicksort)对所有内容进行排序。 当需要比较两行以找出最先出现的行时,它首先会比较两行的a值; 如果相等,则比较b的值; 并且,如果它们也相等,则最后比较c的值。 很简单,对吧? 这也是您要做的。

好的,现在让我们考虑一些棘手的问题。 拿着它:

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

这基本上是同一件事,除了在进行所有排序之前,ORDER BY会获取每一行并计算a+bcd并将结果存储在为排序创建的不可见列中。 然后,它只像上一种情况那样比较这些值。 本质上,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM