2011-04-01 63 views
1

我的表MySQL - 如何在此代碼中插入BETWEEN ... AND?

CREATE TABLE `data` (
    `record_id` int(20) NOT NULL auto_increment, 
    `id_fk` int(20) NOT NULL, 
    `plant_id_fk` int(20) NOT NULL, 
    `date` date NOT NULL, 
    `jsdate` varchar(20) character set latin1 collate latin1_general_ci NOT NULL, 
    `value_1` varchar(20) collate utf8_bin default NULL, 
    `category_1` varchar(200) character set latin1 collate latin1_general_ci default NULL, 
    PRIMARY KEY (`record_id`), 
    KEY `id_fk` (`id_fk`), 
    KEY `plant_id_fk` (`plant_id_fk`) 
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

看起來像這樣

29 1 50 2010-05-20 2010, 4, 20  10 expenses 
23 1 52 2010-12-13 2010, 11, 13 10 expenses 
22 1 50 2011-01-10 2011, 0, 10  10 expenses 
21 1 51 2011-02-07 2011, 1, 07  10 expenses 
14 1 50 2011-03-31 2011, 2, 31  12 exercise 
20 1 50 2011-04-01 2011, 3, 01  10 expenses 

我使用這個SQL代碼來運行一個查詢

select up.id_fk, p.plant_name, up.plant_id_fk, ym2, ifnull(sum(data.value_1),0) totalvalue_1 
from (select distinct date_format(date, '%Y-%m') ym, date_format(date, '%b %Y') ym2 from data where data.id_fk=1 
cross join (select distinct data.id_fk, data.plant_id_fk from data where data.id_fk=1) up 
inner join plants p on p.plant_id = up.plant_id_fk 
left join data on date_format(data.date, '%Y-%m') = dates.ym 
      and up.id_fk=data.id_fk 
      and up.plant_id_fk=data.plant_id_fk 
      and category_1='expenses' 
group by up.id_fk, up.plant_id_fk, ym2, ym 
order by up.id_fk, up.plant_id_fk, date(concat(ym,'-1')) 

我希望能夠過濾使用的結果日期範圍,例如

$dc = date("Y-m-d", strtotime("now")); 
$df = date("Y-m-d", strtotime((date('Y')) . "-01-01")); 

和MySQL的使用類似

WHERE data.date BETWEEN $dc AND $df 

但還沒有找到在哪裏查詢插入此條款上面。

任何建議,以完成這項工作?任何指針都非常感謝。謝謝!

回答

2

根據http://www.tizag.com/sqlTutorial/sqlgroupby.php(在頁面的底部),你應該能夠做到這一點,如果你改變你的where子句的having子句,並把它放在order bygroup by子句之間:

select up.id_fk, p.plant_name, up.plant_id_fk, ym2, ifnull(sum(data.value_1),0) totalvalue_1 
from (select distinct date_format(date, '%Y-%m') ym, date_format(date, '%b %Y') ym2 from data where data.id_fk=1 
cross join (select distinct data.id_fk, data.plant_id_fk from data where data.id_fk=1) up 
inner join plants p on p.plant_id = up.plant_id_fk 
left join data on date_format(data.date, '%Y-%m') = dates.ym 
      and up.id_fk=data.id_fk 
      and up.plant_id_fk=data.plant_id_fk 
      and category_1='expenses' 
group by up.id_fk, up.plant_id_fk, ym2, ym 
HAVING data.date BETWEEN $dc AND $df 
order by up.id_fk, up.plant_id_fk, date(concat(ym,'-1')) 

希望有幫助。

+0

做了一些更改並作爲編輯提交給您的回覆 - 代碼現在完美運行 - 非常感謝! – pepe 2011-04-01 21:57:39

相關問題