MySQL: Multi Tables - отношение один ко многим, столбец Get, у которого один из дочерних столбцов не равен NULL - PullRequest
0 голосов
/ 25 августа 2018

Мне нужна помощь в создании SQL-запроса.

Я хочу получить все заказы, чей ни один из res_id дочернего элемента не равен нулю.

В приведенном ниже примере вы увидите, order_audit.order_id W1 есть один для многие отношения temp_order_id W1_1 и W1_2. Это temp_order_id имеет еще res_id 12 и 32. Этот приказ W1 должен быть в ответе.

В случае W2 вы можете увидеть, что W2_1 имеет resp_id null. Так что это не должно быть потянуто.

order_audit

+----+----------+
| id | order_id |
+----+----------+
|  1 | W1       |
|  2 | W2       |
|  2 | W3       |
+----+----------+

order_mapping

+----------+---------------+
| order_id | temp_order_id |
+----------+---------------+
| W1       | W1_1          |
| W1       | W1_2          |
| W2       | W2_1          |
| W2       | W2_2          |
| W3       | W3_1          |
+----------+---------------+

temp_order_table

+---------------+--------+
| temp_order_id | res_id |
+---------------+--------+
| W1_1          | 12     |
| W1_2          | 32     |
| W2_1          | null   |
| W2_2          | 33     |
| W3_1          | null   |
+---------------+--------+

Из вашего скриншота видно, что в Account есть начальный пробел (и, возможно, есть и конечные).

Любая помощь будет признательна

Ответы [ 3 ]

0 голосов
/ 25 августа 2018

Вы можете естественным образом объединить все 2 другие таблицы и проверить, является ли res_id нулевым.

select oa.id, oa.order_id from order_audit oa
  where not exists (
    select * from order_mapping om
    join temp_order_table tot on
    tot.temp_order_id = om.temp_order_id
    where om.order_id = oa.order_id and tot.res_id is null
  )

Вот ссылка для sqlfiddle ссылка

0 голосов
/ 25 августа 2018

Я бы подошел к этому, используя group by и having:

select om.order_id
from order_mapping om left join
     temp_order_table tot
     on om.temp_order_id = tot.temp_order_id
group by om.order_id
having count(tot.temp_order_id) = count(tot.res_id);
0 голосов
/ 25 августа 2018

Вы можете использовать NOT IN для ордера с нулем

  select oa.order_id 
  from order_audit oa
  where oa.order_id NOT IN (

        select om.order_id 
        from order_mapping om
        inner join (
        select to.temp_order_id 
        from temp_order_table to 
        where to.res_id is null 
        ) t on t.temp_order_id = om.temp_order_id
  ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...