Думаю, я что-то не понимаю, но у меня очень странный результат, а не в.
У меня есть такие таблицы
Табличные мембраны
idMembre
1
2
...
Табличные мембраны_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 в этом результате?
большое спасибо за вашу помощь
EDIT: после первого ответа я понимаю проблему... на самом деле моя просьба намного сложнее. Я работаю над полной динамической системой фильтрации, созданной формой 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
note... этот запрос не выполняет работу по той же причине моего первоначального упрощенного примера.
я не знаю, могу ли я сделать это без использования предложения или подзапросов... это довольно сложно. Я думаю, подзапросы - единственный способ? что ты думаешь?...
Как говорили другие, у вас много записей для каждого члена, и когда хотя бы одна из записей соответствует вашему not in
состоянии, она появится в результирующем наборе.
Один из подходов состоит в том, чтобы найти всех членов, у которых есть оскорбительная запись, а затем вернуть набор дополнений:
SELECT
m.idMembre
FROM
membres_has_domaines m
WHERE
m.idMembre NOT IN (
SELECT idMembre
FROM membres_has_domaines
WHERE idDomaine = 40
);
Поскольку у вас также есть записи как:
idMembre idDomaine
1 10
1 11
3 22
Поэтому перед группой по заявлению вы получите следующий результат:
idMembre idDomaine
1 10
1 11
2 10
2 13
2 20
3 22
Они находятся в результате, потому что ваши данные имеют строки, которые соответствуют 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
. Учитывая ваши данные образца и запрос, он не нужен для запроса. Если вам нужны другие столбцы, то это должно быть частью запроса.
Select *
без «Group by»idMembre in (1, 3)
иidDomaine not in (40)
. Вы, вероятно, ищетеNOT EXISTS
.