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: ユーザー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) は、他の s のemployee他の投稿を持っていません。post_type
  2. 投稿を持っていないユーザー (1、7) は、日付employeeから計算を取得しました。user-registered

しかし、このクエリは次の場合に壊れます

  1. 投稿を持っているユーザーは他のemployee投稿も持っていますpost_type

employee post_type日付の計算を投稿のみに制限できないためです。ユーザーがpostまたは またはpageを持っている場合attachment、たとえば最新の よりも 2 日新しい場合employee、日付計算では代わりにpostまたはpageまたはからの結果が返されattachmentます。

だから私は を含めようとしましたが、他のすべてのユーザーが投稿を持っていないため、返されるのは6つWHERE post_type = 'employee'だけです。したがって、要件の 2 番目を失います。IDemployee

どうすればいいですか?前もって感謝します。

4

3 に答える 3

2

Try:

You can use a CASE expression within the aggregate function MIN to derive the minimum date difference across only post_dates where post_type is 'employee'. If there are no post_types with 'employee' for a particular user, use his/her registered date instead for the comparison.

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 on 句に条件を追加する代わりに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
于 2012-08-03T09:12:13.853 に答える
0

これは、他の制約に従って正しい答えではない可能性があります - 従業員が登録するときにデフォルトの投稿を追加するとどうなりますか? それはあなたの頭痛を和らげますか?

于 2012-08-03T09:15:22.050 に答える