Как в MySQL сделать сложную выборку из двух и более таблиц?

Постараюсь описать понятно.

Есть две таблицы, запросы на расчет, и ответы по этим запросам.
Таблица 1: project_calculation_send
Тут хранятся отправленные запросы от пользователей.
------------------------
| send_id | project_id | 
------------------------
|  1      |  12340     |
|  2      |  12341     | *
|  3      |  12342     |
|  4      |  12343     |
|  5      |  12344     | * (null)


Таблица с ответами: `project_calculation`
Тут соответственно ответы расчета если они есть.
-------------------------
 id | send_id | user_id |
-------------------------
| 1 |  1      | 2  **
| 2 |  1      | 35 **
| 3 |  2      | 35
| 4 |  3      | 2
| 5 |  4      | 2


Нужно найти запросы пользователя на которые еще нет ответа. Плюс к этому нужно учитывать, что ответ от пользователя с ID != 2, также считается без ответа.

Проблема описана тут:
Если в запросе есть несколько ответов (project_calculation), от разных пользователей, например от пользователя с ID 2 и 35 (как в send_id=1), мой запрос получает запись с `id`=2 всего лишь пропуская с `id` = 1. Мне же не нужно вообще получать запись с `id`=2 так как тут ответил пользователь с ID 2 (`project_calculation`.`id`=1).

Делаю следующее (в запросе еще дополнительные таблицы, для фильтра)
SELECT `project_calculation_send`.`project_id`	
FROM `project_calculation_send` 
LEFT JOIN `project_calculation` ON `project_calculation_send`.`send_id`=`project_calculation`.`send_id`
WHERE `project_calculation`.`user_id` IS NULL OR `project_calculation`.`user_id` != 2


Ожидаю получить только две записи project_id` = 12341 и 12344 (так как никто не ответил)
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
jemunjho
@jemunjho
А зачем тут джойн? Просто выбираете все send_id с user_id = 2 и исключаете их из основной таблицы.

select
	*
from project_calculation_send as p
where p.send_id not in (select send_id from project_calculation where user_id = 2)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы