mysql LEFT JOIN选择查询结果有限

时间:2012-06-14 12:32:23

标签: mysql sql join where

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

用户:

  • user_idfnamelnameemail

user_timesheet:

  • time_iduser_idmonthstatedate

用户要将时间添加到user_time表,状态为“否”,并在月末提交更改状态的时间=“是”,假设月份是“六月” 我想写一个查询,它将带来所有没有加时间的用户以及那些已经增加时间但没有提交给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月增加时间的用户。

3 个答案:

答案 0 :(得分:0)

首先,创建一个查询,该查询匹配在指定时间段内添加时间的所有用户的userId,其中“YES”状态=>你拥有所有“好”的用户。然后你必须选择不在该列表中的所有用户。您可以使用not in,a not sub with sub query或minus查询。

示例不在:

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
  )
)

答案 1 :(得分:0)

而不是(a = x或a为null)where子句将过滤器放在ON子句中。这将删除不匹配的记录,但保留左连接的性质。

将'no'状态视为不存在的行,将其从左连接中过滤掉:

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中,所以在尝试查询之前删除这一行。

答案 2 :(得分: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'