我有一个SQL查询,这是我一直关注的部分。
$query = "SELECT DISTINCT user.firstname, user.lastname, user.userid FROM user, staff WHERE user.type = 'Staff' AND staff.userid!= user.userid";
出于某种原因,它只打印出用户是员工的部分,但打印出!=不工作,哪里好像我撤掉了!并且只有staff.user_id=user.user_id,它可以工作并打印出这两个表中的所有用户?
有人能解释一下为什么会发生这种情况,并提出解决方案吗。
编辑
TABLE USER TABLE STAFF
ID - NAME - TYPE ID - NUMBER
1 - A - Staff 1 - 11111
2 - B - Staff 2 - 22222
3 - C - Customer
4 - D - Customer
5 - E - Staff
6 - F - Staff
如何查找用户id 5和6?
尝试<>
而不是!=
。
编辑问题的编辑答案:
SELECT user.firstname, user.lastname, user.userid
FROM user LEFT JOIN staff ON user.userid=staff.userid
WHERE user.type = 'Staff' AND staff.userid IS NULL ;
好吧,根据你的评论,我认为这就是你想要的:
SELECT DISTINCT user.firstname, user.lastname, user.userid
FROM user u
LEFT JOIN staff s ON (s.userid = u.userid)
WHERE (s.userid is null) AND (u.type = 'Staff')
左联接将在用户表(左表)中查找具有匹配userid的所有记录,并查找不具有匹配userid的记录。
所以修改了查询
SELECT *
FROM user u
LEFT JOIN staff s ON (s.userid = u.userid)
将返回
1-A-员工1-1111112-B-工作人员2-222223-C-客户NULL NULL NULL4-D-客户NULL NULL NULL5-E-职员NULL NULL6-F-职员NULL NULL
添加部分WHERE子句
SELECT *
FROM user u
LEFT JOIN staff s ON (s.userid = u.userid)
WHERE (s.userid is null)
将返回:
3-C-客户NULL NULL NULL4-D-客户NULL NULL NULL5-E-职员NULL NULL6-F-职员NULL NULL
最后,完整的查询将返回
SELECT *
FROM user u
LEFT JOIN staff s ON (s.userid = u.userid)
WHERE (s.userid is null) AND (u.type = 'Staff')
将返回:
5-E-职员NULL NULL6-F-职员NULL NULL
注意:假设用户表是唯一的,则"DISTINCT"是多余的。
目前还不清楚您想要实现什么。您正在联接两个表(user和staff),并使用联接条件,其中用户类型为staff,用户和staff表之间的userid不匹配。
使用JOIN语法表示
SELECT DISTINCT user.firstname, user.lastname, user.userid
FROM user u
JOIN staff s ON (s.userid != u.userid)
WHERE u.type = 'Staff'
但是您在选择中没有使用Staff表中的任何内容。所以我一开始就不清楚是否有必要加入它?
您也可以尝试
SELECT user.firstname, user.lastname, user.userid FROM user,staff
WHERE user.userid=staff.userid and user.type = 'Staff' AND staff.userid IS NULL;