Php MySQL查询和间隔
这是我提出过的最难的问题: 此查询从三个不同的数据库表中获取数据,以检查数据库中是否有人今天有聚会。在拉脱维亚,我们也有命名日。不管怎么说,这个查询工作得很好,也做得很好,但现在我想让它更酷一点 我想让它显示,下周谁将举行一个聚会。你可能已经注意到Facebook每个周末给你发送的电子邮件,上面显示了谁的生日即将到来 但我就是不明白如何至少达到这个间隔Php MySQL查询和间隔,php,sql,date,intervals,Php,Sql,Date,Intervals,这是我提出过的最难的问题: 此查询从三个不同的数据库表中获取数据,以检查数据库中是否有人今天有聚会。在拉脱维亚,我们也有命名日。不管怎么说,这个查询工作得很好,也做得很好,但现在我想让它更酷一点 我想让它显示,下周谁将举行一个聚会。你可能已经注意到Facebook每个周末给你发送的电子邮件,上面显示了谁的生日即将到来 但我就是不明白如何至少达到这个间隔 我记得PHP有一些很好的函数,你可以在哪一天开始月份等等,但是这里可能有一些聪明的人,他们愿意帮助我加快速度。我不确定你的查询是否正确,但是中
我记得PHP有一些很好的函数,你可以在哪一天开始月份等等,但是这里可能有一些聪明的人,他们愿意帮助我加快速度。我不确定你的查询是否正确,但是中提到了命令
SYSDATE()
。您可能想尝试以下方法:
... where date = SYSDATE() + 7
(检查语法,我来自Oracle;))
这将得到未来7天的派对
SELECT
`user`.`id`,
`user`.`fname`,
`user`.`lname` ,
YEAR(`user`.`bday`) AS `bday_year`,
`user`.`class_id`,
(
SELECT
`class`.`class_name`
FROM `wp_class_classes` `class`
WHERE `user`.`class_id` = `class`.`id`
) AS `class_name`,
CASE
WHEN MONTH(`week`.`Date`) = MONTH(`user`.`bday`) AND
DAY(`week`.`Date`) = DAY(`user`.`bday`) THEN 1
ELSE 2
END AS `event_type`
FROM `wp_class_users` `user`
LEFT JOIN `wp_class_namedays` `name` ON `user`.`fname` = `name`.`names`
LEFT JOIN (
SELECT CURDATE() + INTERVAL (1 - DAYOFWEEK(CURDATE())) DAY AS `Date` UNION ALL
SELECT CURDATE() + INTERVAL (2 - DAYOFWEEK(CURDATE())) DAY UNION ALL
SELECT CURDATE() + INTERVAL (3 - DAYOFWEEK(CURDATE())) DAY UNION ALL
SELECT CURDATE() + INTERVAL (4 - DAYOFWEEK(CURDATE())) DAY UNION ALL
SELECT CURDATE() + INTERVAL (5 - DAYOFWEEK(CURDATE())) DAY UNION ALL
SELECT CURDATE() + INTERVAL (6 - DAYOFWEEK(CURDATE())) DAY UNION ALL
SELECT CURDATE() + INTERVAL (7 - DAYOFWEEK(CURDATE())) DAY
) `week`
ON CONCAT(MONTH(`week`.`Date`), '.', DAY(`week`.`Date`)) IN (
CONCAT(MONTH(`user`.`bday`), '.', DAY(`user`.`bday`)),
`name`.`day`
)
WHERE `week`.`Date` IS NOT NULL
用户表与name day表联接,然后将结果集与当前星期的日期进行比较。最终的结果集只列出那些生日或姓名发生在一周内的用户
例如,如果您想了解下周的事件,只需将week.Date
定义中的间隔更改为8-DAYOFWEEK…
,9-DAYOFWEEK…
等
最后一件事是,您可以使用内部联接
,而不是选择列表中的相关子查询,如下所示:
SELECT
`user`.`id`,
`user`.`fname`,
`user`.`lname` ,
YEAR(`user`.`bday`) AS `bday_year`,
`user`.`class_id`,
`class`.`class_name`
FROM `wp_class_users` `user`
INNER JOIN `wp_class_classes` `class` ON `user`.`class_id` = `class`.`id`
LEFT JOIN `wp_class_namedays` `name` ON ... /* the rest of the above script */
CASE
WHEN MONTH(`week`.`Date`) = MONTH(`user`.`bday`) AND
DAY(`week`.`Date`) = DAY(`user`.`bday`) THEN 1
ELSE 0
END +
CASE CONCAT(MONTH(`week`.`Date`), '.', DAY(`week`.`Date`))
WHEN `name`.`day` THEN 2
ELSE 0
END AS `event_type`
上面定义的
event\u type
列可以告诉您该事件是否为生日,但它不会让您知道该特定人员的生日和姓名日期
如果您希望有这种区别,您可以更改事件类型
定义如下:
SELECT
`user`.`id`,
`user`.`fname`,
`user`.`lname` ,
YEAR(`user`.`bday`) AS `bday_year`,
`user`.`class_id`,
`class`.`class_name`
FROM `wp_class_users` `user`
INNER JOIN `wp_class_classes` `class` ON `user`.`class_id` = `class`.`id`
LEFT JOIN `wp_class_namedays` `name` ON ... /* the rest of the above script */
CASE
WHEN MONTH(`week`.`Date`) = MONTH(`user`.`bday`) AND
DAY(`week`.`Date`) = DAY(`user`.`bday`) THEN 1
ELSE 0
END +
CASE CONCAT(MONTH(`week`.`Date`), '.', DAY(`week`.`Date`))
WHEN `name`.`day` THEN 2
ELSE 0
END AS `event_type`
现在,该列的结果将是:
- 1–生日
- 2–命名日
- 3–两者都有
此外,您可以使用
'B'
而不是1
,'N'
而不是2
(以及'
而不是0
)。结果将是'B'
,或'N'
,或'BN'
。不过,不确定是否可以将+
用于串联。如果没有,请将两个CASE
s放入CONCAT()
请将相关代码发布在这里,而不是其他地方,这样做是为了显示代码。我认为,接下来的七天一点也不难,但本周呢?正确的链接应该是。由于等式运算符,此查询(使用正确的函数)将只选择一个日期而不是一周。在函数中,您可以查找一周中的实际日期,从该点开始,您可以执行我在变量中使用的“+7”,该变量的值从“this day”到“next sunday”,类似于今天=周一,星期天是6天(或7天,但你计算它),所以变量是+6,下周包括+13(6+7=13),如果你想“这周”,你可以使用得到当天的指数。然后,您可以在星期五的今天和星期五(7-dayofweek)之间进行WHERE生日,以获得“本周”的生日。但你为什么要提醒用户过去的生日呢?除非他们的实际当事人是较晚的;)当我尝试执行此查询时,我发现一个错误:#1064-您的SQL语法有错误;查看MySQL服务器版本对应的手册,了解使用第16行“DAYS ASDate
UNION ALL SELECT CURDATE()+INTERVAL(2-DAYOFWEEK)DAYS”的正确语法我真的不知道,这有什么不对,因为我以前从未做过类似的间隔,如果你能帮助我,我将不胜感激。谢谢。@Robert:DAYOFWEEK
实际上应该是DAYOFWEEK(CURDATE())
。对不起,是我的错。修复了这个问题。感谢您的努力,但我仍然收到相同的错误:#1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'DAYS ASDate
UNION ALL SELECT CURDATE()+INTERVAL(2-DAYOFWEEK(CURDATE)的正确语法16@Robert:在间隔表达式中将DAYS
更改为DAY
。再次抱歉。嘿,再次感谢您的努力:)感谢上帝,第16行现在已经很清楚了。但是语法上还有一个错误。#1064-您的SQL语法有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解使用“varchar(2))+”附近的正确语法。+CAST(DAY(week
Date
)作为varchar(2))in(CAST(MONTH)”在第24行