排除mysql查询结果

时间:2012-11-27 22:47:55

标签: php mysql sql

这是我桌子的图像:

client table

我想选择class_id不等于48的所有行,如下所示:

SELECT * FROM `clients` WHERE `class_id` != '$class_id' AND user_id = ".$_SESSION['user_id']." 

这是问题所在,你可以看到Steve Puddin Robinson有一行有class_id 48和class_id 64.由于这个人已经在48级,我想从结果中排除那里的名字。这是否有意义,如果不将特定的first_name last_namenickname传递给查询

,这是否可行

工作查询

SELECT * 
FROM `clients` 
WHERE `user_id`= ".$_SESSION['user_id']." AND `nickname` 
NOT IN(SELECT `nickname` FROM `clients`
WHERE `class_id` = '$class_id')

修改后的查询

SELECT c.* FROM clients c
LEFT JOIN clients c1
ON `c1`.`first_name` = `c`.`first_name`
AND `c1`.`last_name` = `c`.`last_name`
AND `c1`.`nickname` = `c`.`nickname`
AND `c1`.`class_id` = 48
WHERE `c1`.`class_id` IS NULL;

2 个答案:

答案 0 :(得分:0)

我建议您的数据结构无法正常运行。你基于他们的名字建立联系,这可能会在某些时候失败。每个人没有唯一身份证吗?我看到了一个client_id和user_id,但这些并没有建议一个人的全局ID。

如果有两个“史蒂夫史密斯”怎么办?

答案 1 :(得分:0)

这个怎么样?

SELECT * FROM clients
WHERE nickname NOT IN
(SELECT nickname FROM clients
 WHERE class_id = 48)

或者,如果需要名字,姓氏和昵称的组合来识别客户,那么这个:

SELECT c.* FROM clients c
LEFT JOIN clients c1
ON c1.first_name = c.first_name
AND c1.last_name = c.last_name
AND c1.nickname = c.nickname
AND c1.class_id = 48
WHERE c1.class_id IS NULL

选中SQLfidle进行测试。