2011-02-28 79 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