[英]How to join table with condition on row values?
以下是我的表格数据
表A
| amount | range | id |
+--------+---------+-----+
| 720 | 1 | 115 |
| 360 | 2 | 115 |
| 180 | 3 | 115 |
| 180 | 4 | 115 |
| 135 | 5 | 115 |
| 135 | 10 | 115 |
表B
+------+-----+
| rank | a_id|
+------+-----+
| 1 | 115 |
| 2 | 115 |
| 3 | 115 |
| 4 | 115 |
| 5 | 115 |
| 6 | 115 |
| 7 | 115 |
| 8 | 115 |
| 9 | 115 |
| 10 | 115 |
我需要通过连接这两个表来获得以下结果。
+------+-----+--------+
| rank | a_id| amount |
+------+-----+--------+
| 1 | 115 |720
| 2 | 115 |360
| 3 | 115 |180
| 4 | 115 |180
| 5 | 115 |135
| 6 | 115 |135
| 7 | 115 |135
| 8 | 115 |135
| 9 | 115 |135
| 10 | 115 |135
由于我尝试了以下查询。 但是我无法获得确切的结果。 因为它仅与等级匹配。 我也尝试过使用大小写查询,但没有得到确切的结果。 关于如何解决的任何建议
select rank
, sample_test.amount
from a
join b
on a.id = b.a_id
and rank = range
order
by rank
加入表并按等级a_id分组以获得每个组的最小数量:
select
b.rank, b.a_id, min(a.amount) amount
from tableb b inner join tablea a
on b.a_id = a.id and b.rank >= a.range
group by b.rank, b.a_id
参见演示 。
根据时间间隔和等级,可能的逻辑(还不够清楚)可能是在ON子句中使用相反的符号,并使用max代替min:
select
b.rank, b.a_id, max(a.amount) amount
from tableb b inner join tablea a
on b.a_id = a.id and b.rank <= a.range
group by b.rank, b.a_id
参见演示 。
这两个查询(针对此样本数据)均返回相同的结果:
| rank | a_id | amount |
| ---- | ---- | ------ |
| 1 | 115 | 720 |
| 2 | 115 | 360 |
| 3 | 115 | 180 |
| 4 | 115 | 180 |
| 5 | 115 | 135 |
| 6 | 115 | 135 |
| 7 | 115 | 135 |
| 8 | 115 | 135 |
| 9 | 115 | 135 |
| 10 | 115 | 135 |
在MySQL中,我将使用相关子查询:
SELECT b.*,
(SELECT a.amount
FROM TableA a
WHERE a.range <= b.rank AND
a.id = b.a_id
ORDER BY a.range DESC
) as Amount
FROM TableB b;
特别是,这可以利用TableA(id, range desc)
上的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.