首页 > 解决方案 > 仅对 MySQL 结果中的 id 重复列

问题描述

我在编写 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 表中的 id 与 order_items 表的 order_id 连接起来。

正如您在结果表中看到的那样。

但我想要的是结果不应该包含重复的运费。

它应该只包含 order_items 表中每个 id 的单个交付费用值,或者我们可以说结果中对于相同的 order_ids 应该只有一个 delivery_charge 值。

请帮我解决一下这个。

标签: mysqlsqldatabasejoin

解决方案


假设我理解这个问题,您可以在没有窗口函数或变量的情况下执行此操作:

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;

推荐阅读