![](/img/trans.png)
[英]Select rows from a table where id in another second table based on second table ids shows results top as well as next results as it is + Mysql
[英]How to omit select results based on IDs from another table in mySQL?
我的目标是我想从我的“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解决方案?
最后的答案,完美的工作。 也许它没有像其他一些解决方案那样优化,但它是唯一一个每次都给我有效结果的解决方案。 出于某种原因,其他解决方案有时会出现意外的名称,或者根本没有名称。 无论如何,这肯定比使用PHP还要长。
SELECT user_id, user_name FROM users WHERE user_id NOT IN (SELECT user_id FROM projects_users WHERE project_id = 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;
与JOIN
( INNER 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;
尝试这个:
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
请尝试以下方法:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.