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句をhave句に変更し、order byとの間に置くと、それを実行できるはずです。group 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 に答える