1

我的桌子

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

但是在上面的查询中没有找到在哪里插入这个子句。

有什么建议可以完成这项工作吗?任何指针都非常感谢。谢谢!

4

1 回答 1

2

根据http://www.tizag.com/sqlTutorial/sqlgroupby.php(在页面底部),如果将 where 子句更改为 having 子句并将其放在 theorder 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'))

希望这会有所帮助。

于 2011-04-01T21:13:45.033 回答