2010-06-29 78 views
1

找到增值税税率,我有这样的两个表:从两个表中选择基于有效日期

 
mysql> desc vat_rates; 
+-------------+---------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-------------+---------------+------+-----+---------+-------+ 
| rate_id  | varchar(5) | NO | PRI | NULL |  | 
| name  | varchar(255) | NO |  | NULL |  | 
| type  | enum('O','I') | NO |  | NULL |  | 
| default  | tinyint(1) | YES |  | 0  |  | 
+-------------+---------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

mysql> desc vat_rates_details; 
+-------------+-------------+------+-----+---------+-------+ 
| Field  | Type  | Null | Key | Default | Extra | 
+-------------+-------------+------+-----+---------+-------+ 
| rate_id  | varchar(10) | NO |  | NULL |  | 
| effect_date | date  | NO |  | NULL |  | 
| rate  | float  | NO |  | NULL |  | 
+-------------+-------------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

我需要一个查询,让我vat_rates.name,vat_rates.rate_id,vat_rates_details.rate其中effect_date是MAX()但是< =比now()。

简化起见,我需要选择所有vat_rates,其中rate字段是基于effect_date的最后一个日期,但不是将来。

实施例与数据:

vat_rates:
rate_id = 'L9'
名= 'MyVatName'
类型= 'O'
默认= 1个

vat_rates_details(第1行):
rate_id ='L9'
effect_date ='200 0-01-01'
率= 20

vat_rates_details(线2):
rate_id = 'L9'
effect_date = '2010-06-01'
率= 19

vat_rates_details(第3行):
rate_id = 'L9'
effect_date = '2010-07-01'
率= 21

预期的结果:

 
+-------------+-------------+------+ 
| rate_id  | name  | rate | 
+-------------+-------------+------+ 
| L9   | MyVatName | 19 | 
+-------------+-------------+------+ 

感谢您的时间:)

编辑:预期收益率是19不是20韩国社交协会贾斯汀。

+0

不是你期待的19的速度,而不是20? – 2010-06-29 18:49:36

+0

你是对的Justin我的坏。 – mjsilva 2010-06-29 20:32:54

回答

1
select rd.rate_id, r.name, rd.rate 
from (
    select rate_id, max(effect_date) as MaxEffectDate 
    from vat_rates_details 
    where effect_date < now() 
    group by rate_id 
) rdm 
inner join vat_rates_details rd on rdm.rate_id = rd.rate_id and rdm.MaxEffectDate = rd.effect_date 
inner join vat_rates r on rd.rate_id = r.rate_id 
+0

如果您将rd.rate添加到选择的第一部分,这将返回您想要的结果 – 2010-06-29 18:59:35

0

其他可能的方法:

SELECT 
    VR.name, 
    VR.rate_id, 
    VRD1.rate 
FROM 
    Vat_Rates VR 
INNER JOIN Vat_Rate_Details VRD1 ON 
    VRD1.rate_id = VR.rate_id AND 
    VRD1.effect_date < NOW()  -- Is this the correct syntax for mySQL? 
LEFT OUTER JOIN Vat_Rate_Details VRD2 ON 
    VRD2.rate_id = VR.rate_id AND 
    VRD2.effect_date < NOW() AND 
    VRD2.effect_date > VRD1.effect_date 

SELECT 
    VR.name, 
    VR.rate_id, 
    VRD1.rate 
FROM 
    Vat_Rates VR 
INNER JOIN Vat_Rate_Details VRD1 ON 
    VRD1.rate_id = VR.rate_id AND 
    VRD1.effect_date < NOW() 
WHERE NOT EXISTS 
(
    SELECT * 
    FROM Vat_Rate_Details VRD2 
    WHERE 
     VRD2.rate_id = VR.rate_id AND 
     VRD2.effect_date < NOW() AND 
     VRD2.effect_date > VRD1.effect_date 
)