两张桌子不相等


two tables not equal

我有一个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;