powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
5 сообщений из 5, страница 1 из 1
Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
    #38787149
pavelforever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такие таблицы:
компании companies
| ID | NAME |
|----|--------------------|
| 1 | Первая компания |
| 2 | Вторая компания |
| 3 | Третья компания |
| 4 | Четвертая компания |

мэйлы emails
| ID | NAME |
|----|---------------------|
| 1 | first@fdsfjsfj.dfs |
| 2 | second@fdsfjsfj.dfs |
| 3 | third@fdsfjsfj.dfs |
| 4 | forth@fdsfjsfj.dfs |

связывающая таблица companies_emails
| COMPANY_ID | EMAIL_ID |
|------------|----------|
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |

айдишники мыл, которые отправили попадают в таблицу touches

| ID | EMAIL_ID |
|----|----------|
| 1 | 1 |

Задача: вывести только те компании, в которых ни один мэйл не был отправлен (не попал в таблицу touches).
Я пытался сделать это так:
Код: sql
1.
2.
SELECT `companies`.* from companies
where id in (select company_id from companies_emails where email_id not in (select email_id from mail_touches));


потом так:
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM `companies`
Where EXISTS (select * from `companies_emails` as ce where
`companies`.`id`=`ce`.`company_id`
AND NOT EXISTS ( Select id from `mail_touches` where `mail_touches`.`email_id`=`ce`.`email_id`)
);


и даже так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT DISTINCT `companies`.* 
FROM  `companies` 
RIGHT JOIN  `companies_emails` AS ce ON  `companies`.`id` =  `ce`.`company_id` 
WHERE NOT 
EXISTS (
SELECT id
FROM  `mail_touches` 
WHERE  `mail_touches`.`email_id` =  `ce`.`email_id` 
);



Но всё это не работает. Выводятся компании, где есть хотя бы один мэйл, попавший в таблицу (touches). Мне же надо, чтоб выводились только компании, где нет ни одного отправленного мыла.
То есть конкретно в нашем случае должна остаться "Вторая компания", т.к. только в ней есть мэйлы и все нетронуты.
Вот здесь нагляднее http://sqlfiddle.com/#!2/bf544/8
...
Рейтинг: 0 / 0
Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
    #38787150
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavelforever,

что нибудь типа:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select 
  c.* 
from 
  companies c
join
(
  select  
    ce.COMPANY_ID
  from
    companies_emails ce 
    left join touches t
  group by ce.COMPANY_ID
  having count(ce.COMPANY_ID)= sum(t.id is NULL)
) z
ON z.COMPANY_ID = c.ID
...
Рейтинг: 0 / 0
Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
    #38787153
pavelforever
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

спасибо! похоже работает:))
если без ошибок, то код так будет выглядеть:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select 
  c.* 
from 
  companies c
join
(
  select  
    ce.company_id
  from
    companies_emails ce
  left join mail_touches t
    on ce.email_id=t.email_id
  group by ce.COMPANY_ID
  having count(ce.COMPANY_ID)= sum(t.id is NULL)
) as z
ON z.company_id = c.id
...
Рейтинг: 0 / 0
Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
    #38787160
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavelforever,

угу, связку я зре пропустил конечно.

Кстати, можно упростить

having count(t.id) = 0

Если t.id is null то КАУНТ его не посчитает.
(если я не ошибаюсь)
...
Рейтинг: 0 / 0
Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
    #38787409
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pavelforeverЕсть такие таблицы:
компании companies
| ID | NAME |
|----|--------------------|
| 1 | Первая компания |
| 2 | Вторая компания |
| 3 | Третья компания |
| 4 | Четвертая компания |

мэйлы emails
| ID | NAME |
|----|---------------------|
| 1 | first@fdsfjsfj.dfs |
| 2 | second@fdsfjsfj.dfs |
| 3 | third@fdsfjsfj.dfs |
| 4 | forth@fdsfjsfj.dfs |

связывающая таблица companies_emails
| COMPANY_ID | EMAIL_ID |
|------------|----------|
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |

айдишники мыл, которые отправили попадают в таблицу touches

| ID | EMAIL_ID |
|----|----------|
| 1 | 1 |

Задача: вывести только те компании, в которых ни один мэйл не был отправлен (не попал в таблицу touches).
Я пытался сделать это так:
Код: sql
1.
2.
SELECT `companies`.* from companies
where id in (select company_id from companies_emails where email_id not in (select email_id from mail_touches));


потом так:
Код: sql
1.
2.
3.
4.
5.
SELECT * FROM `companies`
Where EXISTS (select * from `companies_emails` as ce where
`companies`.`id`=`ce`.`company_id`
AND NOT EXISTS ( Select id from `mail_touches` where `mail_touches`.`email_id`=`ce`.`email_id`)
);


и даже так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT DISTINCT `companies`.* 
FROM  `companies` 
RIGHT JOIN  `companies_emails` AS ce ON  `companies`.`id` =  `ce`.`company_id` 
WHERE NOT 
EXISTS (
SELECT id
FROM  `mail_touches` 
WHERE  `mail_touches`.`email_id` =  `ce`.`email_id` 
);



Но всё это не работает. Выводятся компании, где есть хотя бы один мэйл, попавший в таблицу (touches). Мне же надо, чтоб выводились только компании, где нет ни одного отправленного мыла.
То есть конкретно в нашем случае должна остаться "Вторая компания", т.к. только в ней есть мэйлы и все нетронуты.
Вот здесь нагляднее http://sqlfiddle.com/#!2/bf544/8

а вообще задача элементарная...только на подобные задачи надо смотреть под другим углом.

у нас есть таблицы... надо компании где ни один мейл не трогался.

а что если сначала получить компании, где хотябы один мейл трогался:)

имея все компании и компании где хоть один трогался - получить компании где ни один не трогался - сразу елементарно:)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как выбрать только тогда, когда хоть один из результатов подзапроса не вернул значение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]