Повторите только столбцы для идентификатора в результате MySQL - PullRequest
0 голосов
/ 01 сентября 2018

Я застрял с проблемой при написании запроса MySQL. Есть две таблицы:

Заказы:

| id   | item_id | delivery_charges |
|------|---------|------------------|
| 1000 | 11      | 17.7             |
| 2000 | 22      | 17.7             |

order_items

| id  | order_id |
|-----|----------|
| 111 | 1000     |  
| 112 | 1000     |
| 113 | 2000     |
| 114 | 2000     |
| 115 | 2000     |

результат

| id   | order_id | delivery_charges |
|------|----------|------------------|
| 111  | 1000     | 17.7             |
| 112  | 1000     | 17.7             |
| 113  | 2000     | 17.7             |
| 114  | 2000     | 17.7             |
| 115  | 2000     | 17.7             |

Желаемый результат

| id  | order_id | delivery_charges |
|-----|----------|------------------|
| 111 | 1000     | 17.7             |
| 112 | 1000     |                  |
| 113 | 2000     | 17.7             |
| 114 | 2000     |                  |
| 115 | 2000     |                  |

Я выполнил внутреннее соединение для обеих таблиц, соединяя идентификатор из таблицы Orders с order_id таблицы order_items.

Как видно из таблицы результатов.

Но я хочу, чтобы результат не содержал повторную доставку.

Он должен содержать только одно значение стоимости доставки для каждого идентификатора в таблице order_items или мы можем сказать, что в результате должен быть только один параметр delivery_charge для тех же идентификаторов order_ids.

Пожалуйста, помогите мне с этим.

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Предполагая, что я понимаю вопрос, вы можете сделать это без оконных функций или переменных:

select oi.*,
       (case when oi.id = oim.first_id then o.delivery_charge end) as delivery_charge
from orders o join
     order_items oi
     on o.id = oi.order_id join
     (select oi2.order_id, min(oi2.id) as first_id
      from order_items oi2
      group by oi2.order_id
     ) oim
     on oim.order_id = oi.order_id;

Это также можно сформулировать как:

select oi.*, oim.delivery_charge
from order_items oi join
     (select o.id, min(oi2.id) as first_id,
             min(o.delivery_charge) as delivery_charge
      from order_items oi2 join
           orders o
            on oi2.order_id = o.id
      group by o.id
     ) oim
     on oim.order_id = oi.order_id;
0 голосов
/ 01 сентября 2018

Возможно я ошибаюсь, но это может быть связано с декартовыми произведениями в SQL У меня нет точного ответа, но это может помочь enter image description here

Примените логику в соответствии с предложением JOIN и попробуйте!

0 голосов
/ 01 сентября 2018

вам нужна функция row_number (), чтобы сделать ваш результат, но mysql 5.6 не поддерживает функцию row_number, поэтому попробовал ее вручную

     select t1.id,t1.order_id ,case when rank=1 then 
  delivery_charges else null end as  delivery_charges  from
        (
         select  t.*, 
               @rownum := @rownum + 1 AS rank from 
        (
        select ot.*,o.delivery_charges
         Orders o inner join
         Order_items ot on o.id =ot.order_id 
        )  as t , (SELECT @rownum := 0) r   
        )    as t1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...