Mysql的另一个表中筛选数据的范围

问题描述:

我有一个“转移”表有“量”列...的“转移”表的结构看起来像这样Mysql的另一个表中筛选数据的范围

-------------------------------------------------------- 
| id | from_account_id | to_account_id | date | amount | 
-------------------------------------------------------- 

还有更实际的列但上述这些列与我的问题

现在我还有一个表,让我们说“promo_dtl”表,显示申请交易目前茂德..表看起来像这样

------------------------------------------------------------------- 
| id | promo_id | min_amount_trx | max_amount_trx | cashback_type | cashback_value | max_cashback_value | 
01最相关现在我要做的是,我想从“转移”表来查询,通过 min_amount_trx,并从“promo_dtl”表 max_amount_trx范围内对其进行筛选..

编辑: 例如,有2条记录在“promo_dtl”表,具有相同promo_id值..第一行有min_amount_trx 100和max_amount_trx 1000 ..和第二有min_amount_trx 5000和

,所以我想找到交易金额为1000 100之间的记录和5000至10000之间

我想这简单的查询

select * from transfers trf 
where trf.amount 
    between (select min_amount_trx from promo_dtl where promo_id = 1) 
    and (select max_amount_trx from promo_dtl where promo_id = 1) 
; 

但是这是我从上面的查询得到

Error Code: 1242. Subquery returns more than 1 row 

那么我该如何正确获取数据?我必须使用连接吗?如果是这样,任何人都可以帮助我吗?感谢:d

+1

添加一些示例表数据以及预期的结果 - 所有以及格式化文本(即无图像或链接。) – jarlh

+0

Error意味着SubQuery应该返回1行,所以如果我理解你的意思,它看起来像在你使用的子查询中,你必须'Select MIN(min_amount_trx)'和'Select MAX(max_amount_trx)' –

+0

你需要将单行值传递给query valeu。但你的子查询会重新调整多行。所以这是抛出错误。 – JYoThI

您可以使用一个内连接这种方式,我认为:

Select * from transfers 
INNER JOIN promo_dtl 
on transfers.amount >= promo_dtl.min_amount_trx 
    AND dbo.transfers.amount <= promo_dtl.max_amount_trx 
    AND promo_id = 1 

这应该给你所有你需要的数据。
我创建了一个小样本,以测试和这里的结果:

id   from_account_id to_account_id date     amount 
----------- --------------- ------------- ----------------------- ----------- 
1   1    2    2017-06-02 11:02:11.937 75 
2   3    4    2017-06-02 11:02:21.950 300 
3   5    6    2017-06-02 11:02:31.777 750 

(3 row(s) affected) 

id   promo_id min_amount_trx amx_amount_trx 
----------- ----------- -------------- -------------- 
1   1   50    100 
2   1   500   1000 
3   2   250   400 

(3 row(s) affected) 

id   from_account_id to_account_id date     amount  id   promo_id min_amount_trx amx_amount_trx 
----------- --------------- ------------- ----------------------- ----------- ----------- ----------- -------------- -------------- 
1   1    2    2017-06-02 11:02:11.937 75   1   1   50    100 
3   5    6    2017-06-02 11:02:31.777 750   2   1   500   1000 
+0

谢谢@PaulKaram,它工作的很好,很快:D – thekucays

的问题是其中之一:

select min_amount_trx from promo_dtl where promo_id = 1 

select max_amount_trx from promo_dtl where promo_id = 1 

正在返回更多一行。哪些不起作用。你可以这样做:

select * from transfers trf 
where trf.amount 
    between (select MIN(min_amount_trx) from promo_dtl where promo_id = 1) 
    and (select MAX(max_amount_trx) from promo_dtl where promo_id = 1) 
; 

可以使用最小和最大汇总范围

更新:

即使它没有真正意义的我。 如果你喜欢做你在说什么。你可以试试和EXISTS。就像这样:

SELECT 
    * 
FROM 
    transfers 
WHERE EXISTS 
(
    SELECT NULL 
    FROM promo_dtl 
    WHERE promo_dtl.promo_id=1 
    AND transfers.amount 
     BETWEEN promo_dtl.min_amount_trx 
     AND promo_dtl.max_amount_trx 
); 
+0

如果我使用min()max(),如果有2行,第一个是min:100 max:500,第二个是min:1000 max:5000 ..所以查询将查找100到5000之间的记录。是不必要的 – thekucays

+0

但是谁应该选择? – Arion

+0

他们俩..所以在上面的情况下,我想找到100-500和1000-5000之间的交易:D – thekucays