0

这是我的桌子的图像:

客户表

我想选择所有 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_name和传递nickname给查询,这是否可能

工作查询

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;
4

2 回答 2

0

我建议您的数据结构无法正常工作。您是根据他们的名字建立联系的,这可能会在某些时候失败。每个人没有唯一的ID吗?我看到一个 client_id 和 user_id,但这些并不建议一个人的全局 ID。

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

于 2012-11-27T22:52:23.063 回答
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

检查SQLfile来测试它。

于 2012-11-28T21:05:54.513 回答