如何根据mySQL中另一个表的ID省略选择结果?

时间:2012-01-09 01:24:53

标签: php mysql sql database

我的目标是,我希望从“users”表中获取数据库中的用户名列表,但是省略ID也在“projects_users”表中的每个用户,其中project_id = 1。

换句话说,如果这些是表格:

table: users
user_id   user_name
1         dave
2         matt
3         james

table: projects_users
user_id   project_id
1         2
2         2
3         1

此查询将返回“dave”和“matt”(因为“james”在users表中,但也与项目#1相关联,因此省略了它。)

我知道我应该使用某种形式的连接,但我当前的查询没有这样做:

SELECT user_name
FROM users
JOIN projects_users ON (
    users.user_id != (projects_users.user_id WHERE projects_users.user_id == 1)
)

此结果根本不起作用,早期的实验仍然会返回每个名称的多个副本。有没有人知道如何做到这一点,而无需转向更手动的PHP解决方案?

4 个答案:

答案 0 :(得分:2)

最后的答案,完美地运作。也许它没有像其他一些解决方案那样优化,但它是唯一一个每次都给我有效结果的解决方案。出于某种原因,其他解决方案有时会出现意外的名称,或者根本没有名称。无论如何,这肯定比使用PHP还要长。

SELECT user_id, user_name FROM users WHERE user_id NOT IN (SELECT user_id FROM projects_users WHERE project_id = 1)

感谢大家的贡献。我感谢您的所有帮助和意见。

答案 1 :(得分:1)

原始答案

利用LEFT JOIN

的力量
SELECT u.* 
FROM users u
LEFT JOIN project_users pu ON u.user_id = pu.user_id
WHERE pu.project_id IS NULL OR pu.project_id <> 1;

JOININNER JOIN的快捷方式)不同,LEFT JOIN选择主表中的所有行及其连接表中的匹配行,但如果找不到匹配的行,则返回一个假的,所有字段都设置为NULL

修改

当我重新阅读这个问题时,我觉得我弄错了。如果您只想过滤掉与某个项目相关联的用户,那么这是一个要使用的查询。

SELECT DISTINCT u.user_id, u.user_name 
FROM project_users pu
LEFT JOIN users u ON u.user_id = pu.user_id
WHERE pu.project_id <> 1;

答案 2 :(得分:1)

试试这个:

SELECT DISTINCT
    users.user_id,
    user_name
FROM
    projects_users
RIGHT JOIN
    users
ON
    users.user_id = projects_users.user_id
WHERE
    projects_users.project_id <> 1
OR
    projects_users.project_id IS NULL

答案 3 :(得分:0)

尝试以下方法:

select u.*
from users u
where exists (select null 
              from projects_users pu1 
              where u.user_id = pu1.user_id)
and not exists (select null 
                from projects_users pu2 
                where u.user_id = pu2.user_id and pu2.project_id = 1)

可替换地:

select u.*
from users u
join projects_users pu on u.user_id = pu.user_id
group by u.user_id
having max(case when pu.project_id = 1 then 1 else 0 end) = 0