一个奇怪的问题,因为它有效,但我不明白为什么。我希望了解为什么这样做。 我搜索了网络和stackOverflow的答案,但找不到答案 (我通过反复试验得到了这段代码......)
我一直试图按3列排序。
我希望前两列的结果混合在一起,但首先是第三列(日期)排序的所有结果
这是基本的数据库表结构:
注意: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
希望这个问题是允许的,因为它让我觉得为什么这是有效的,我想学习这个以供将来参考....
提前致谢,我很高兴能够帮助我理解这一点的任何人!
答案 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。
因此,当HomePage
和FeaturedProfile
都是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,并且行将最后排序。)