1

我正面临一种情况,需要帮助。我有两张桌子:

用户:

  • user_id, fname, lname, email.

用户时间表:

  • time_id, user_id, month, state, date.

用户将时间添加到user_time表中,状态为 = 'no' 并在月底提交更改状态 = 'yes' 的时间,假设月份是 JUNE 我想编写一个查询,将带来所有用户根本没有添加时间的用户,以及添加了时间但未在 6 月提交的用户。

这是我的查询。

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

首先,首先创建一个查询,该查询与在指定时间段内添加时间且状态为“YES”的所有用户的 userId 相匹配 => 您拥有所有“好”用户。那么您只需选择不在该列表中的所有用户。您可以在子查询或减号查询中使用不存在、不存在。

没有 in 的例子:

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 回答
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
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 回答