MySQL多个顺序(嵌套的那种)

时间:2014-10-07 02:37:46

标签: php mysql sql-order-by

一个奇怪的问题,因为它有效,但我不明白为什么。我希望了解为什么这样做。 我搜索了网络和stackOverflow的答案,但找不到答案 (我通过反复试验得到了这段代码......)

我一直试图按3列排序。

我希望前两列的结果混合在一起,但首先是第三列(日期)排序的所有结果

这是基本的数据库表结构:

  • HomePage =布尔值,
  • FeaturedProfile = boolean
  • Name = string
  • DateModified = date

注意:HomePage和FeaturedProfile都可以为0(所以任何都是0的结果都应该在下面(并且是!)

这是可行的SQL代码:

SELECT DISTINCT
HomePage, Profile, Name
FROM tProfiles
ORDER BY (HomePage = 0 AND FeaturedProfile = 0), e.DateModified DESC

这是我不理解的ORDER BY,因为我的逻辑会说使用1而不是0 +我不确定括号在做什么,因为我认为下面会有效(就像在PHP中一样) (和)似乎对我更合乎逻辑。

ORDER BY (HomePage, FeaturedProfile), e.DateModified DESC

希望这个问题是允许的,因为它让我觉得为什么这是有效的,我想学习这个以供将来参考....

提前致谢,我很高兴能够帮助我理解这一点的任何人!

3 个答案:

答案 0 :(得分:2)

当你创建一个条件语句时,有一个布尔结果为true,false或null ...所以true或false结果与整数相同.. 0表示false,1表示true ..所以如果你是例如想要知道列等于你可以做SUM(val = 1)的某个值的数字,并且只要表达式为真,它将返回1,如果它为假,它将返回0并从总和中省略。结果将是给出计数的真实条件的总和。当你做ORDER BY然后是条件时它做同样的事情。要么按0或1排序......所以当它的真实时它们将被分组在1类......当它为假时它将被分组在0类。希望有意义

所以理解

ORDER BY (HomePage = 0 AND FeaturedProfile = 0), e.DateModified DESC

当主页和特色配置文件都为0时,那意味着它将被排序第二,因为它是一个真实的声明..然后当它为假时它将为0所以它将在默认的ASC顺序中首先排序...日期将按降序排列

答案 1 :(得分:2)

这是您的order by条款:

ORDER BY (HomePage = 0 AND FeaturedProfile = 0),
         e.DateModified DESC

它有两个组成部分。第一个是布尔表达式(HomePage = 0 AND FeaturedProfile = 0),它可以采用三个值:true,false和NULL。请记住,MySQL将布尔值视为整数,其中true为1,false为0。

因此,当HomePageFeaturedProfile都是0(false)时,表达式的计算结果为TRUE。并且,它的值为1.如果其中一个或两个都是1,则表达式的计算结果为FALSE,值为0。因此,这些将按排序顺序排在第一位,因为0小于1

我相信您的数据设置方式,这表示您在其中一个字段中有数据。

第二个组成部分是日期,因此在每个组中,日期按降序排序。

答案 2 :(得分:2)

ORDER BY子句中的第一个表达式,即:

(e.HomePage = 0 AND e.FeaturedProfile = 0)

是MySQL的简写,它等同于ANSI标准:

 CASE WHEN (e.HomePage = 0 AND e.FeaturedProfile = 0) THEN 1
      WHEN (e.HomePage IS NOT NULL AND e.FeaturedProfile IS NOT NULL) THEN 0
      ELSE NULL
 END

该表达式后面省略了ASC / DESC关键字,因此它默认为ASC(升序)。

最终结果是将按以下顺序返回行:

首先:布尔表达式返回0的行(FALSE)(即,两列都具有非NULL值的任何行,以及任一列(或两列)的非零值。)

后跟:布尔表达式返回1的行(TRUE)(即两列的值都为零的任何行)

后面是其中任一列为NULL的行。


你是对的,还有其他方法可以达到相同的效果。例如:

ORDER BY (e.HomePage AND e.FeaturedProfile), e.DateModified DESC

ORDER BY子句中的第一个表达式被计算为布尔表达式。这就是说同样的事情:如果任一列为NULL,则结果为NULL。否则,如果任一列为FALSE(具有零值),则结果为FALSE(0)。否则结果将为TRUE(1)。该表达式的结果按升序排序。

如果以这种方式处理NULL值并不重要,那么我们真正感兴趣的是获取HomePage或FeaturedProfile为非零的行:

ORDER BY (e.HomePage OR e.FeaturedProfile) DESC, e.DateModified DESC

这略有不同。例如,如果HomePage为1且FeaturedProfile为NULL,则表达式将计算为1,并且将首先对行进行排序。 (在这种情况下,原始函数将返回NULL,并且行将最后排序。)