左加入一些数据
LEFT JOIN some data WHERE
我有两个 mySQL 表(订单和详细信息),我想获取 type = sale
和 [=15] 的所有订单(包括 date
和 amount
) =] 对于特定的 affiliate
.
到目前为止,我可以 post 尝试 20 种不同的方法,但其中 none 有效,这将是对 space 的浪费。我对此很着急,但查看其他 Whosebug 问题并没有帮助。
+--------------------------------------------+
| orders |
+---------+----------+------------+----------+
| orderID | type | date | status |
+---------+----------+------------+----------+
| 1 | sale | 11/01/2020 | complete |
| 2 | sale | 12/01/2020 | pending |
| 3 | sale | 13/01/2020 | complete |
| 4 | sale | 14/01/2020 | complete |
| 5 | giveaway | 15/01/2020 | complete |
+---------+----------+------------+----------+
+-----------------------------+
| details |
+---------+-----------+-------+
| orderID | key | value |
+---------+-----------+-------+
| 1 | amount | 30 |
| 1 | affiliate | 999 |
| 2 | amount | 40 |
| 2 | affiliate | 999 |
| 3 | amount | 60 |
| 3 | affiliate | 333 |
| 4 | amount | 70 |
| 5 | amount | 80 |
+---------+-----------+-------+
affiliate = 999
的预期输出
+---------+-------------+--------+
| orderID | date | amount |
+---------+-------------+--------+
| 1 | 11/01/2020 | 30 |
+---------+-------------+--------+
您必须加入 orders
到 details
的 2 个副本:
select o.orderID, o.date, d2.value amount
from orders o
inner join details d1 on d1.orderID = o.orderID and d1.key = 'affiliate' and d1.value = 999
inner join details d2 on d2.orderID = o.orderID and d2.key = 'amount'
where o.status = 'complete'
参见demo。
结果:
> orderID | date | amount
> ------: | :--------- | -----:
> 1 | 11/01/2020 | 30
一个选项使用两个连接:
select o.orderid, o.date, sum(dam.value) amount
from orders o
inner join details daf on daf.orderid = o.orderid
inner join details dam on dam.orderid = o.orderid
where
and o.status = 'complete'
and daf.key = 'affiliate' and daf.value = 999
and dam.key = 'amount'
您还可以使用单连接和条件聚合:
select o.orderid, o.date,
sum(case when d.key = 'amount' then d.value else 0 end) amount
from orders o
inner join details d on d.orderid = o.orderid
where o.status = 'complete'
group by o.orderid
having max(d.key = 'affiliate' and d.value = 999) = 1
我有两个 mySQL 表(订单和详细信息),我想获取 type = sale
和 [=15] 的所有订单(包括 date
和 amount
) =] 对于特定的 affiliate
.
到目前为止,我可以 post 尝试 20 种不同的方法,但其中 none 有效,这将是对 space 的浪费。我对此很着急,但查看其他 Whosebug 问题并没有帮助。
+--------------------------------------------+
| orders |
+---------+----------+------------+----------+
| orderID | type | date | status |
+---------+----------+------------+----------+
| 1 | sale | 11/01/2020 | complete |
| 2 | sale | 12/01/2020 | pending |
| 3 | sale | 13/01/2020 | complete |
| 4 | sale | 14/01/2020 | complete |
| 5 | giveaway | 15/01/2020 | complete |
+---------+----------+------------+----------+
+-----------------------------+
| details |
+---------+-----------+-------+
| orderID | key | value |
+---------+-----------+-------+
| 1 | amount | 30 |
| 1 | affiliate | 999 |
| 2 | amount | 40 |
| 2 | affiliate | 999 |
| 3 | amount | 60 |
| 3 | affiliate | 333 |
| 4 | amount | 70 |
| 5 | amount | 80 |
+---------+-----------+-------+
affiliate = 999
+---------+-------------+--------+
| orderID | date | amount |
+---------+-------------+--------+
| 1 | 11/01/2020 | 30 |
+---------+-------------+--------+
您必须加入 orders
到 details
的 2 个副本:
select o.orderID, o.date, d2.value amount
from orders o
inner join details d1 on d1.orderID = o.orderID and d1.key = 'affiliate' and d1.value = 999
inner join details d2 on d2.orderID = o.orderID and d2.key = 'amount'
where o.status = 'complete'
参见demo。
结果:
> orderID | date | amount
> ------: | :--------- | -----:
> 1 | 11/01/2020 | 30
一个选项使用两个连接:
select o.orderid, o.date, sum(dam.value) amount
from orders o
inner join details daf on daf.orderid = o.orderid
inner join details dam on dam.orderid = o.orderid
where
and o.status = 'complete'
and daf.key = 'affiliate' and daf.value = 999
and dam.key = 'amount'
您还可以使用单连接和条件聚合:
select o.orderid, o.date,
sum(case when d.key = 'amount' then d.value else 0 end) amount
from orders o
inner join details d on d.orderid = o.orderid
where o.status = 'complete'
group by o.orderid
having max(d.key = 'affiliate' and d.value = 999) = 1