我正面临着一种情况,需要帮助。我有两张桌子:
用户:
user_id
,fname
,lname
,email
。user_timesheet:
time_id
,user_id
,month
,state
,date
。用户要将时间添加到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月增加时间的用户。
答案 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'