1

私は状況に直面しており、助けが必要です。私は2つのテーブルを持っています:

ユーザー:

  • user_id, fname, lname, email.

ユーザータイムシート:

  • time_id、、、、、。user_id_ month_ state_date

ユーザーは状態 = 'no' でテーブルに時間を追加user_timeし、月末にその時間を送信すると、月が 6 月であると仮定して状態 = 'yes' に変更されます。すべてのユーザーを取得するクエリを作成したい時間をまったく追加しなかったユーザーと、時間を追加したが JUNE に送信していないユーザー。

これは私の質問です。

SELECT user_timesheet.time_id, user_timesheet.user_id, 
    user_timesheet.month, user_timesheet.`state`, 
    `user`.user_id, `user`.fname, `user`.lname,  
    `user`.email
FROM user LEFT JOIN  
     user_timesheet ON user.user_id=user_timesheet.user_id
WHERE (
    user_timesheet.state = 'no' OR 
    user_timesheet.state IS NULL) 
AND (
    user_timesheet.month = 'june' OR 
    user_timesheet.month IS NULL)
GROUP BY user.user_id

結果は、6 月に時間を追加したがそれを送信したすべてのユーザーと、参加してからシステムに時間を追加したことがないユーザーをもたらします。ただし、前月に時間を追加したり提出したりしたものの、6 月の時間をまったく追加していないユーザーは表示されません。

4

3 に答える 3

0
SELECT user_timesheet.time_id, user_timesheet.user_id, user_timesheet.month, user_timesheet.`state`, 
       `user`.user_id, `user`.fname, `user`.lname, `user`.email
  FROM user 
  LEFT JOIN user_timesheet
    ON user.user_id=user_timesheet.user_id
    AND user_timesheet.month = 'june' AND user_timesheet.state = 'no'
于 2012-06-14T13:16:02.887 に答える
0

where 句の (a = x or a is null) の代わりに、フィルターを ON 句に入れます。これにより、一致しないレコードが削除されますが、左結合の性質は維持されます。

「いいえ」ステータスを存在しない行として扱うには、左結合から除外します。

SELECT user_timesheet.time_id, user_timesheet.user_id, 
       user_timesheet.month, user_timesheet.`state`, 
       `user`.user_id, `user`.fname, `user`.lname,  
       `user`.email
  FROM user 
  LEFT JOIN user_timesheet
  -- Eliminate users who have submitted 'no'
  -- For June
    ON user.user_id=user_timesheet.user_id
    -- Turn 'no' status into null record
   AND user_timesheet.state <> 'no'
   AND user_timesheet.month = 'june'
  -- If there is no row in user_timesheet
  -- It means that
  --    a) There was not any
  --    b) There was a 'no' status
 WHERE user_timesheet.user_id is null
 GROUP BY user.user_id

注: MySql のコメント マーカーとは何かわかりません。これは -- Sql Server にあるため、クエリを実行する前にこの行を削除してください。

于 2012-06-14T12:59:41.030 に答える
0

まず、指定された期間に「YES」状態で時間を追加したすべてのユーザーの userId に一致するクエリを作成することから始めます => すべての「良い」ユーザーを取得します。次に、そのリストにないすべてのユーザーを選択する必要があります。not in、not exists をサブクエリまたはマイナスクエリで使用できます。

にない例:

SELECT user_timesheet.time_id, user_timesheet.user_id, user_timesheet.month, user_timesheet.`state`, `user`.user_id, `user`.fname, `user`.lname,  `user`.email
  FROM user LEFT JOIN user_timesheet ON user.user_id=user_timesheet.user_id
where user.user_id not in (
  select user.user_id 
    from user inner join user_timesheet ON user.user_id=user_timesheet.user_id 
  where user_timesheet.state = 'yes' 
  AND user_timesheet.month = june
  )
)
于 2012-06-14T12:42:55.967 に答える