Php MySQL多订单(嵌套类型)

Php MySQL多订单(嵌套类型),php,mysql,sql-order-by,Php,Mysql,Sql Order By,一个奇怪的问题,因为它正在工作,但我不明白为什么。我希望了解为什么这是工作。 我在网上和stackOverflow搜索了答案,但没有找到 (我通过反复试验得出了这个代码…) 我一直在试着按3列排序 我希望前两列的结果混合在一起,但所有结果都按第三列排序(日期) 这是基本的数据库表结构: 主页=布尔值 FeaturedProfile=布尔值 名称=字符串 DateModified=日期 注意:HomePage和FeaturedProfile都可以是0(因此任何同时为0的结果都应该在下面(并且是

一个奇怪的问题,因为它正在工作,但我不明白为什么。我希望了解为什么这是工作。 我在网上和stackOverflow搜索了答案,但没有找到 (我通过反复试验得出了这个代码…)

我一直在试着按3列排序

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

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

  • 主页=布尔值
  • FeaturedProfile=布尔值
  • 名称=字符串
  • DateModified=日期
注意:HomePage和FeaturedProfile都可以是0(因此任何同时为0的结果都应该在下面(并且是!))

这是有效的SQL代码:

SELECT DISTINCT
HomePage, Profile, Name
FROM tProfiles
ORDER BY (HomePage = 0 AND FeaturedProfile = 0), e.DateModified DESC
这是我不理解的顺序,因为我的逻辑会说使用1而不是0+,我也不确定括号在做什么,因为我假设下面的内容会起作用(就像在PHP求和中),并且对我来说更符合逻辑

ORDER BY (HomePage, FeaturedProfile), e.DateModified DESC
希望这个问题是允许的,因为它是困扰我,为什么这是工作,我想了解这一点,供将来参考


提前感谢,我将很高兴为任何能帮助我理解这一点的人打分

当你做一个条件语句时,有一个布尔结果,要么为真,要么为假,要么为空。。。因此,正确或错误的结果与整数相同。。0表示false,1表示true。。因此,如果您想知道某列等于某个值的数字,您可以执行
SUM(val=1)
,并且无论何时该表达式为真,它都将返回1如果为假,它将返回0并从总和中删除。。最终结果将是给出计数的真实条件的总和。当你先下订单,然后下条件,它也会做同样的事情。。按0或1排序。。。因此,当这是真的,他们将在1类分组。。。如果为false,则将其分组在0类别中。希望这是有道理的

所以有了这样的理解

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

这意味着当主页和特色配置文件都为0时,这将被排在第二位,因为这是一个真实的声明。。当它为false时,它将为0,因此它将以默认的ASC顺序首先排序。。。当你做一个条件语句时,日期将按降序排列,有一个布尔结果,要么是真的,要么是假的,要么是空的。。。因此,正确或错误的结果与整数相同。。0表示false,1表示true。。因此,如果您想知道某列等于某个值的数字,您可以执行
SUM(val=1)
,并且无论何时该表达式为真,它都将返回1如果为假,它将返回0并从总和中删除。。最终结果将是给出计数的真实条件的总和。当你先下订单,然后下条件,它也会做同样的事情。。按0或1排序。。。因此,当这是真的,他们将在1类分组。。。如果为false,则将其分组在0类别中。希望这是有道理的

所以有了这样的理解

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

这意味着当主页和特色配置文件都为0时,这将被排在第二位,因为这是一个真实的声明。。当它为false时,它将为0,因此它将以默认的ASC顺序首先排序。。。日期将按降序排列

这是您的
order by
子句:

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

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

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


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

这是您的
order by
子句:

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

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

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


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

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

(e.HomePage=0和e.FeaturedProfile=0)
是MySQL的缩写,相当于ANSI标准:

当(e.HomePage=0和e.FeaturedProfile=0)为1时的情况
当(e.HomePage不为NULL且e.FeaturedProfile不为NULL)时,则0
否则无效
结束
该表达式后面省略了ASC/DESC关键字,因此它默认为ASC(升序)

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

第一:布尔表达式返回0(FALSE)的行(即,对于两列都具有非NULL值,对于其中一列(或两列)都具有非零值的任何行)

后跟:布尔表达式返回1(TRUE)的行(即任何具有zer的行)