2012-08-03 11 views
1

我有以下查詢以下結果:如何正確地從MySQL中的連接表中取出受日期計算約束的記錄?

SELECT users.ID, user_registered, post_date, post_type 
FROM users LEFT OUTER JOIN posts ON users.ID = post_author 
ORDER BY ID, user_registered, post_date, post_type 

    ID user_registered   post_date  post_type 
---+-----------------+------------------+--------------+ 
    1 6/18/2012 4:04  6/18/2012 4:04   page 
    1 6/18/2012 4:04  6/18/2012 4:04   post 
    1 6/18/2012 4:04 6/18/2012 10:32 nav_menu_item 
    1 6/18/2012 4:04 6/18/2012 10:32 nav_menu_item 
    1 6/18/2012 4:04 6/18/2012 10:32 nav_menu_item 
    1 6/18/2012 4:04 6/18/2012 10:32 nav_menu_item 
    1 6/18/2012 4:04 6/18/2012 10:32 nav_menu_item 
    1 6/18/2012 4:04 6/18/2012 10:33 nav_menu_item 
    1 6/18/2012 4:04 6/18/2012 10:48  attachment 
    1 6/18/2012 4:04 6/19/2012 10:32  attachment 
    1 6/18/2012 4:04  6/30/2012 6:49 nav_menu_item 
    1 6/18/2012 4:04  6/30/2012 7:04 nav_menu_item 
    1 6/18/2012 4:04  7/1/2012 7:39  attachment 
    1 6/18/2012 4:04 7/13/2012 10:00   page 
    1 6/18/2012 4:04 7/20/2012 18:18   page 
    1 6/18/2012 4:04 7/21/2012 16:37   post 
    1 6/18/2012 4:04 7/23/2012 14:15   page 
    1 6/18/2012 4:04 7/31/2012 15:12   post 
    1 6/18/2012 4:04  8/1/2012 8:47  attachment 
    2 6/19/2012 10:05    NULL   NULL 
    6 6/29/2012 4:47 6/19/2012 10:11  attachment 
    6 6/29/2012 4:47 6/19/2012 10:15  attachment 
    6 6/29/2012 4:47 6/19/2012 10:17  attachment 
    6 6/29/2012 4:47 6/19/2012 10:20  attachment 
    6 6/29/2012 4:47 6/19/2012 10:22  attachment 
    6 6/29/2012 4:47  6/28/2012 0:00  employee 
    6 6/29/2012 4:47  6/29/2012 0:00  employee 
    6 6/29/2012 4:47  8/1/2012 0:00  employee 
    6 6/29/2012 4:47  8/2/2012 0:00  employee 
    6 6/29/2012 4:47  8/2/2012 0:00  employee 
    6 6/29/2012 4:47  8/2/2012 0:00  employee 
    7 7/7/2012 16:52 7/31/2012 14:26   post 
    20 7/21/2012 14:48 7/21/2012 21:53   post 
    20 7/21/2012 14:48 7/22/2012 12:50   post 
    21 7/27/2012 14:56    NULL   NULL 
  • ID:用戶ID。唯一,主鍵
  • user_registered:日期時間,當用戶成爲網站的一部分
  • post_date:日期時間時,職位是由用戶創建的
  • post_type:由用戶創建的帖子類型後

    1. 我需要得到用戶上次發帖後的天數employeepost_date其中post_type = 'employee')。
    2. 如果用戶還沒有發佈employee帖子,那麼我需要獲取用戶註冊後的天數(user_registered)。

需要量

我需要得到的只是所有用戶

  1. 其最新employee發佈日期是如的ID< 7天或>= 14天,或BETWEEN 6 AND 14根據需要;或
  2. 如果用戶沒有employee帖子,請獲取註冊日期爲< 7天或>= 14天的用戶或BETWEEN 6 AND 14在#1中的用戶。

我嘗試以下查詢一個< 7情況:

SELECT users.ID 
FROM users LEFT OUTER JOIN posts ON users.ID = post_author 
GROUP BY ID 
HAVING MIN(DATEDIFF(NOW(), IFNULL(post_date, user_registered))) < 7 

和它產生的ID的1,6和7如預期的,因爲:

  1. 用戶(6)誰有employee的帖子沒有任何其他帖子的其他post_type s;和
  2. 沒有employee帖子的用戶(1,7)從他們的user-registered日期計算得出。

但隨後此查詢休息時

  1. 誰也有一個employee後用戶有其他post_type小號

,因爲我不能限制日期計算到的employeepost_type職位只要。如果用戶有一個postpageattachment是,比方說,2天更近的比他的最新employee,日期計算將返回從postpageattachment,而不是結果。

所以我試圖包括WHERE post_type = 'employee',但只有ID 6永遠返回,因爲所有其他用戶沒有employee後。所以我失去了我的要求#2。

我該如何解決這個問題?提前致謝。

回答

2

嘗試:

可以使用聚合函數MINCASE表達推導僅跨post_date S其中post_type是「員工」的最小的時間差。如果某個特定用戶沒有post_type'僱員',請使用他/她的登記日期進行比較。

SELECT a.ID 
FROM  users a 
LEFT JOIN posts b ON a.ID = b.post_author 
GROUP BY a.ID 
HAVING IFNULL(
       MIN(CASE b.post_type WHEN 'employee' THEN DATEDIFF(NOW(), b.post_date) END), 
       DATEDIFF(NOW(), MIN(a.user_registered)) 
     ) < 7 
+0

hm ..這將返回一個空的結果集..在它上面工作,直到我可以使其工作..任何其他想法?謝謝 – 2012-08-03 09:26:07

+0

感謝編輯。謝謝mucho – 2012-08-03 09:30:10

+0

@AnaBan,你的日期列的數據類型是什麼數據類型?在你的例子結果中,這不會影響你的數據類型看起來像有效的DATETIME數據。 – 2012-08-03 09:31:05

1

我認爲,而不是增加post_type = 'employee'條件在where子句添加join子句將解決您的問題。

SELECT users.ID 
FROM users 
    LEFT OUTER JOIN posts 
     ON users.ID = post_author AND 
      post_type = 'employee' 
GROUP BY ID 
HAVING MIN(DATEDIFF(NOW(), IFNULL(post_date, user_registered))) < 7 
+0

hm,這返回一個空集。 :( – 2012-08-03 09:16:47

+0

再次檢查您的數據。對於數據嘗試將條件設置爲<1。 – Omesh 2012-08-03 09:27:43

0

根據您的其他約束,這可能不是一個正確答案 - 如果您在員工註冊時添加默認帖子,該怎麼辦?它會簡化你的頭痛嗎?

+0

不幸的是,我無法控制數據庫,只能從中提取記錄:/ – 2012-08-03 09:17:26

+0

hmnn ...正如所料... ..你可以在問題或評論中完全描述這兩個表嗎? – mrd081 2012-08-03 09:21:02

相關問題