1

我从以下查询中得到以下结果:

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: 用户身份。唯一的主键
  • user_registered:用户成为网站一部分的日期时间
  • post_date: 用户创建帖子的日期时间
  • post_type:用户创建的帖子类型

    1. 我需要获取自用户上次employee发帖以来的天数(post_datewhere post_type = 'employee')。
    2. 如果用户还没有employee发帖,那么我需要获取用户注册后的天数(user_registered)。

要求

我只需要获取ID所有用户

  1. 其最近employee的发布日期是例如< 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按预期产生 s 1、6 和 7,因为:

  1. 有帖子的用户(6)employee没有其他人的任何其他帖子post_type;和
  2. 没有employee帖子的用户(1、7)从他们的user-registered日期开始计算。

但是当这个查询中断时

  1. employee有帖子的用户也有其他post_type

因为我不能将日期计算限制为employee post_type仅限帖子。如果用户有 apost或 apage或 an attachment,即比他的 latest 晚 2 天employee,则日期计算将返回postorpage或的结果attachment

所以我尝试包含WHERE post_type = 'employee',但只ID返回了 6 个,因为所有其他用户都没有employee帖子。所以我失去了我的第二个要求。

我该怎么做?提前致谢。

4

3 回答 3

2

尝试:

您可以使用CASE聚合函数中的表达式来导出仅sMIN之间的最小日期差异,其中'employee' 是。如果特定用户没有带有 'employee' 的 s,请改用他/她的注册日期进行比较。post_datepost_typepost_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
于 2012-08-03T09:19:42.620 回答
1

我认为不是post_type = 'employee'在 where 子句中添加条件 add onjoin子句将解决您的问题。

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
于 2012-08-03T09:12:13.853 回答
0

根据您的其他限制,这可能不是正确答案 - 如果您在员工注册时添加默认帖子怎么办?它会简化你的头痛吗?

于 2012-08-03T09:15:22.050 回答