2014-10-07 48 views
0

一个奇怪的问题,因为它工作,但我不明白为什么。我希望了解为什么这是行得通的。 我已经搜索了网络和stackOverflow的答案,但无法找到一个 (我出来了这个代码通过反复试验...)MySQL多重订单(嵌套类型)

我一直在尝试3列的顺序。

我想从第一2列的结果混在一起,但第一,然后通过第三列(日期)

这是基本的数据库表结构有序的所有结果:

  • 首页=布尔,
  • FeaturedProfile =布尔
  • 名称=字符串
  • DateModified =日期

注:主页,并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 SUM),似乎对我更合乎逻辑。

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

希望这个问题被允许,因为它是缠着我,为什么这是工作,我想了解这个以供将来参考....

在此先感谢,我会很高兴为了让任何人能够帮助我理解这一点!

+0

= 0似乎是一种条件,只对字段进行排序0 – 2014-10-07 03:12:19

回答

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)(即,具有非空值两者的列的任何行和用于任一个(或两者)列的非零值)

其次:行,其中该布尔表达式返回1(真)(即任何具有零个值都列的行)

后跟其中任一列为NULL的行。


你说的没错,还有其他的方法可以达到同样的效果。例如:

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

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

如果在具体的方式处理NULL值并不重要,如果我们是在越来越有主页或FeaturedProfile行作为非零真正感兴趣:

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

这是略有不同。例如,如果HomePage为1并且FeaturedProfile为NULL,则表达式将评估为1,并且该行将首先排序。 (在这种情况下,原始数据将返回NULL,并且该行将排序为最后一次)。

+0

很好的+1包括案例陈述:) – 2014-10-07 03:09:32

+0

谢谢这一切都是光明的!现在我明白了。我确信第一个想到我尝试的是ORDER BY(e.HomePage或e.FeaturedProfile)DESC,e.DateModified DESC,并且我认为这个语法出错了,尽管我可能已经将DESC添加到所有列.... dammmm。再次感谢!! – Ford 2014-10-07 05:02:31

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

SQL中的布尔逻辑是三个值:TRUE,FALSE或NULL。无论是上升还是下降,NULL值都会最后排序。 – spencer7593 2014-10-07 03:19:28

+0

谢谢你,这是现在有道理:-) – Ford 2014-10-07 05:03:16

2

责令这是您的order by条款:

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

它有两个组成部分。第一个是布尔表达式(HomePage = 0 AND FeaturedProfile = 0),它可以采用三个值:true,false和NULL。请记住,MySQL的对待布尔作为整数与真正的为1,假为0

所以,当HomePageFeaturedProfile均为0(假),则表达式评估为TRUE。并且,它的值为1.如果其中一个或两个都是1,则表达式的计算结果为FALSE,值为0。因此,这些将按排序顺序排列,因为0小于1

我相信你的数据设置的方式,这就是说你有这些字段之一的数据。

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

+0

从我+1好解释! – 2014-10-07 03:09:02

+0

谢谢你,这是现在有道理:-) – Ford 2014-10-07 05:03:59