Mysql NOT IN 子句查询不 return 我想要的
Mysql NOT IN clause query does't return what I want
我想我不明白什么,但我有一个非常奇怪的结果,没有。
我有这种表
TABLE 名成员
idMembre
1
2
...
Table membres_has_domaines
idMembre idDomaine
1 10
1 11
1 40
2 10
2 13
2 20
3 40
3 22
我运行这个查询
select m.idMembre from membres m
inner join membres_has_domaines md on m.idMembre=md.idMembre
where md.idDomaine not in (40)
group by m.idMembre
结果让我失望
idMembre
1
2
3
问题是...为什么用户 1 和 3 在这个结果中?
非常感谢您的帮助
编辑:
第一次回答后,我明白了这个问题......
实际上我的要求要复杂得多。我正在开发一个由 HTML 表单生成的完整动态过滤器系统,您可以在其中选择参数...
请求看起来像那样。在这里,我希望域匹配 (1,2) 的成员不包括域 27 和国家 (64, 4, 24)
中的成员
select m.idMembre, memberName,
GROUP_CONCAT(distinct d.domaineName SEPARATOR ", ") as domaines ,
GROUP_CONCAT(distinct a.zipAdresse SEPARATOR ", ") as zips,
GROUP_CONCAT(distinct p.countryName SEPARATOR ", ") as countryNames
from membres
m left join titres t on m.idTitre=t.idTitre
left join civilites c on m.idCivilite=c.idCivilite
left join adresses a on a.idMembre=m.idMembre left
join pays p on a.idCountry =p.idCountry
left join emails e on e.idMembre=m.idMembre
left join membres_has_domaines md on md.idMembre=m.idMembre
left join domaines d on md.idDomaine=d.idDomaine
where 1=1 and md.idDomaine in (1, 2)
and md.idDomaine not like '27'
and a.idCountry in (64, 4, 24)
group by m.idMembre
注意...此查询无法完成工作...出于与我最初的简化示例相同的原因。
我不知道我是否可以在不使用 having 子句或子查询的情况下做到这一点……这很复杂。我认为,子查询是唯一的方法?你怎么看 ? ...
它们出现在结果中是因为您的数据中有符合 not in
条件的行。
如果您想要根本没有“40”的用户,那么您需要将所有行视为一个组。因此,想想 group by
。 . .连同条件:
select md.idMembre
from membres_has_domaines md
where md.idDomaine not in (40)
group by md.idMembre
having sum( md.idDomaine in (40) ) = 0;
having
子句计算每个成员符合条件的行数。 = 0
表示 成员 没有行。
请注意,我删除了 membres
的连接。鉴于您的示例数据和查询,查询不需要它。如果你想要其他列,那么它应该是查询的一部分。
因为您还有如下记录:
idMembre idDomaine
1 10
1 11
3 22
因此,在按语句分组之前,您将得到下一个结果:
idMembre idDomaine
1 10
1 11
2 10
2 13
2 20
3 22
正如其他人所说,每个成员都有很多记录,当至少有一条记录符合您的not in
条件时,它就会出现在结果集中。
一种方法是找到所有确实有违规记录的成员,然后return补充集:
SELECT
m.idMembre
FROM
membres_has_domaines m
WHERE
m.idMembre NOT IN (
SELECT idMembre
FROM membres_has_domaines
WHERE idDomaine = 40
);
我想我不明白什么,但我有一个非常奇怪的结果,没有。
我有这种表
TABLE 名成员
idMembre
1
2
...
Table membres_has_domaines
idMembre idDomaine
1 10
1 11
1 40
2 10
2 13
2 20
3 40
3 22
我运行这个查询
select m.idMembre from membres m
inner join membres_has_domaines md on m.idMembre=md.idMembre
where md.idDomaine not in (40)
group by m.idMembre
结果让我失望
idMembre
1
2
3
问题是...为什么用户 1 和 3 在这个结果中?
非常感谢您的帮助
编辑: 第一次回答后,我明白了这个问题...... 实际上我的要求要复杂得多。我正在开发一个由 HTML 表单生成的完整动态过滤器系统,您可以在其中选择参数... 请求看起来像那样。在这里,我希望域匹配 (1,2) 的成员不包括域 27 和国家 (64, 4, 24)
中的成员select m.idMembre, memberName,
GROUP_CONCAT(distinct d.domaineName SEPARATOR ", ") as domaines ,
GROUP_CONCAT(distinct a.zipAdresse SEPARATOR ", ") as zips,
GROUP_CONCAT(distinct p.countryName SEPARATOR ", ") as countryNames
from membres
m left join titres t on m.idTitre=t.idTitre
left join civilites c on m.idCivilite=c.idCivilite
left join adresses a on a.idMembre=m.idMembre left
join pays p on a.idCountry =p.idCountry
left join emails e on e.idMembre=m.idMembre
left join membres_has_domaines md on md.idMembre=m.idMembre
left join domaines d on md.idDomaine=d.idDomaine
where 1=1 and md.idDomaine in (1, 2)
and md.idDomaine not like '27'
and a.idCountry in (64, 4, 24)
group by m.idMembre
注意...此查询无法完成工作...出于与我最初的简化示例相同的原因。
我不知道我是否可以在不使用 having 子句或子查询的情况下做到这一点……这很复杂。我认为,子查询是唯一的方法?你怎么看 ? ...
它们出现在结果中是因为您的数据中有符合 not in
条件的行。
如果您想要根本没有“40”的用户,那么您需要将所有行视为一个组。因此,想想 group by
。 . .连同条件:
select md.idMembre
from membres_has_domaines md
where md.idDomaine not in (40)
group by md.idMembre
having sum( md.idDomaine in (40) ) = 0;
having
子句计算每个成员符合条件的行数。 = 0
表示 成员 没有行。
请注意,我删除了 membres
的连接。鉴于您的示例数据和查询,查询不需要它。如果你想要其他列,那么它应该是查询的一部分。
因为您还有如下记录:
idMembre idDomaine
1 10
1 11
3 22
因此,在按语句分组之前,您将得到下一个结果:
idMembre idDomaine
1 10
1 11
2 10
2 13
2 20
3 22
正如其他人所说,每个成员都有很多记录,当至少有一条记录符合您的not in
条件时,它就会出现在结果集中。
一种方法是找到所有确实有违规记录的成员,然后return补充集:
SELECT
m.idMembre
FROM
membres_has_domaines m
WHERE
m.idMembre NOT IN (
SELECT idMembre
FROM membres_has_domaines
WHERE idDomaine = 40
);