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