2011-02-28 83 views
0

这是我做过的最艰难的查询: http://robertr.pastebin.com/X4bG4pFpMySQL的查询和间隔

"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` 
FROM `wp_class_users` `user` 
WHERE MONTH( `bday`) = $month AND DAY( `bday`) = $day 
OR `user`.`fname` = 
(SELECT `name`.`names` 
    FROM `wp_class_namedays` `name` 
    WHERE `name`.`day` = '$month.$day' 
    AND `user`.`fname` = `name`.`names`) 

该查询抓起,从三个不同的数据库表中的数据,以检查是否有专人在数据库中,谁拥有党今天。而在拉脱维亚,我们也有姓名日。无论如何,这个查询效果很好,而且做得很好,但现在我想让它变得更酷。

我希望它表明谁将在下周举行派对。您可能已经注意到Facebook每周末向您发送的这些电子邮件显示谁有生日即将到来。

但我只是不明白如何得到至少那个时间间隔?

我记得PHP有一些很好的功能,你可以在哪一天开始月份等等,但是也许这里有一些明亮的心,并且愿意帮助我更快地向前发展。

+1

请在这里发布您的相关代码,而不是在其他地方,因此用于显示代码。 – deceze 2011-02-28 08:47:10

回答

2
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 

用户表中加入了名为天表,然后将结果集是针对当前周的日期进行比较。最终结果集仅列出一周中生日或名称日期发生的用户。

如果你想了解的事件,例如,接下来的一周,你可以简单地改变间隔在week.Date定义为8 - DAYOFWEEK...9 - DAYOFWEEK...

最后一件事是,而不是相关的子查询在选择列表中你可以使用INNER JOIN,像这样:

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 */ 

如上所述,可以告诉你该事件是否是一个生日○event_type列不是,但它不会让你知道它是否是该特定人员的生日和姓名日。

如果你想有这样的区分,你可以改变event_type的定义是这样的:

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'。虽然不确定+是否可以用于连接。如果不是,则将CASEs放入CONCAT()

+0

当我尝试执行这个查询时,我的错误: #1064 - 你的SQL语法有错误;检查对应于你的MySQL服务器版本的手册使用附近的正确的语法“天为'Date' UNION ALL SELECT CURDATE()+间隔(2 - 星期几)天,在第16行 我真的不知道,那里出了什么问题,因为我之前从未做过某种间隔,如果你能帮助我,我将不胜感激。谢谢。 – Rozkalns 2011-02-28 21:14:07

+0

@Robert:'DAYOFWEEK'实际上应该是'DAYOFWEEK(CURDATE())'。我的错,对不起。修正了。 – 2011-02-28 21:53:13

+0

感谢您的努力,但我仍然收到相同的错误: #1064 - 您的SQL语法错误;检查对应于你的MySQL服务器版本使用附近的“天视'Date' UNION ALL SELECT CURDATE()+间隔(2 - DAYOFWEEK(CURDATE”正确的语法手册16行 – Rozkalns 2011-03-01 20:13:50

0

我不确定我是否能够正确查询您的查询,但在the MySQL docs中提到的命令SYSDATE()。你可能会想尝试类似:

... where date = SYSDATE() + 7 

(检查语法,我来自甲骨文;))

这将让双方在接下来的7天。

+0

我认为,接下来的七天根本不算什么,但本周呢? – Rozkalns 2011-02-28 08:50:40

+0

正确的链接是http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_sysdate。由于等号运算符,此查询(具有正确的功能)将只选择一个日期而不是一个星期。 – Lekensteyn 2011-02-28 08:53:51

+0

做一个函数,你可以寻找一个星期的实际日子,从这一点上你可以做一个变量中使用的“+7”,这个变量从“这一天”到“下一个星期日”就像今天=星期一,星期日是6点(或7点,但是你数了)天,所以变量是+6,下周包括+13(6 + 7 = 13) – Husky110 2011-02-28 08:54:23