Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在一个查询中按日期的前一天和后一天的晚上排序_Mysql_Sorting - Fatal编程技术网

Mysql 在一个查询中按日期的前一天和后一天的晚上排序

Mysql 在一个查询中按日期的前一天和后一天的晚上排序,mysql,sorting,Mysql,Sorting,第一:我是法国人,如果我犯了一些语法错误,我很抱歉 我有一张放电视节目的桌子。在一个查询中,我想搜索这个表中的程序,并将结果与当天的所有程序和晚上的程序进行排序 我有一个输入名fullDateStart,其日期为提取小时的DATETIME格式 我在研究中使用左连接。这是我的实际要求: SELECT programId, programTitle, COUNT(*) AS score, ROUND(startDate / 1000) AS start, ROUND(endDate / 1000)

第一:我是法国人,如果我犯了一些语法错误,我很抱歉

我有一张放电视节目的桌子。在一个查询中,我想搜索这个表中的程序,并将结果与当天的所有程序和晚上的程序进行排序

我有一个输入名fullDateStart,其日期为提取小时的DATETIME格式

我在研究中使用左连接。这是我的实际要求:

SELECT programId, programTitle, COUNT(*) AS score,
ROUND(startDate / 1000) AS start, ROUND(endDate / 1000) AS end
FROM people_appearances AS a
LEFT JOIN programsTable AS b ON a.programId = b.program_id
WHERE peopleId = :id AND timestamp > :twoWeeksAgo AND programId != 0
AND redif = 0 AND channel_id IN(1,2,3,5,6,7,8,9)
GROUP BY programId
ORDER BY score DESC, start DESC
LIMIT 0, 10
以下是我对UNION的尝试:

SELECT * FROM (
    SELECT fullDateStart, programId, programTitle, COUNT(*) AS score1,
    ROUND(startDate / 1000) AS start, ROUND(endDate / 1000) AS end
    FROM people_appearances AS a
    LEFT JOIN db.epg_programs AS b ON a.programId = b.program_id
    WHERE HOUR(fullDateStart) > 6 AND HOUR(fullDateStart) <= 23
    AND peopleId = 826 AND timestamp > 1353420511000 AND programId != 0
    AND redif = 0 AND channel_id IN(1,2,3,5,6,7,8,9)
    GROUP BY programId

    UNION
    SELECT fullDateStart, programId, programTitle, COUNT(*) AS score2,
    ROUND(startDate / 1000) AS start, ROUND(endDate / 1000) AS end
    FROM people_appearances AS c
    LEFT JOIN db.epg_programs AS d ON c.programId =d.program_id
    WHERE HOUR(fullDateStart) >= 0 AND HOUR(fullDateStart) <= 6
    AND peopleId = 826 AND timestamp > 1353420511000 AND programId != 0
    AND redif = 0 AND channel_id IN(1,2,3,5,6,7,8,9)
    GROUP BY programId
    ) AS s3
ORDER BY score1 DESC,start DESC
LIMIT 0, 10 

有人能帮我吗?我尝试使用一个包含两个请求的联合[一天一个,晚上一个],但是我没有成功地对结果进行排序,即使它们包含两个请求…

您查询中的问题是排序依据。你要先按分数,然后按开始日期订购所有东西

如果目标是在一天内完成所有工作,那么请执行以下操作:

order by score desc, date(fulldatestart),
         (case when hour(fulldatestart) between 7 and 23 then 1
               else 2
          end),
         hour(fulldatestart)
order by score desc, date(fulldatestart - interval 7 hour),
         hour(fulldatestart - interval 7 hour)
我为ORDERBY添加了第三个子句,因此具有相同分数的程序按小时排序

如果您希望将前一天的清晨时间与之关联,则需要执行以下操作:

order by score desc, date(fulldatestart),
         (case when hour(fulldatestart) between 7 and 23 then 1
               else 2
          end),
         hour(fulldatestart)
order by score desc, date(fulldatestart - interval 7 hour),
         hour(fulldatestart - interval 7 hour)

减去7个小时后,你可以按小时排序。

按分数、开始、小时的顺序?或者你是早上9点到凌晨3点之前来的,因为那是白天和夜晚?不,这不是那么简单,我必须对这些参数进行排序:第一:7h->23h第二:0h->6horder by scor,start,如果hourfulldatestart>=7,1,0,那么hourfulldatestart。根据小时设置优先级,然后在该优先级内,按实际小时排序。我尝试了你的代码,但没有任何更改。。。我不明白条件,这是返回1还是0?如果是,排序条件是什么?顺序/何处可以使用任意值。是一个普通的mysql函数。我才意识到我的逻辑是颠倒的。应该是if…,0,1或至少if…,1,0说明。从技术上讲,您不需要between子句。只有一小时。mysql永远不应该返回24+小时,因为那将是第二天的0+小时。不,这不是我想要的,但它很接近。我希望所有节目的时间都包括在7h->23h中,无论是哪一天,在最后一天之后,我希望夜间节目的时间包括在0h->6h中。在这两个部分中,我希望结果按分数排序,然后按日期描述。因此,如果我有10个结果,每天5个,晚上5个,必须先按分数和日期排序。在第五天的结果之后,晚上的第一个结果就可以出现。如果你想要一个例子,在这个链接中:里面的结果50mn不应该在第一页,不管它是什么分数,因为在7小时到23小时之间有更多的结果。好的,我成功了,谢谢你Marc B。答案是:如果HOURfullDateStart>=7,0,1 ASC,分数描述,日期描述谢谢你,我也是!马克B.你真厉害!