Php MySQL多个子查询,获取日期间隔内每天特定列的第一个值
我在下面的问题上已经纠结了一段时间,不知道该怎么做,下面的解释是:Php MySQL多个子查询,获取日期间隔内每天特定列的第一个值,php,mysql,date,Php,Mysql,Date,我在下面的问题上已经纠结了一段时间,不知道该怎么做,下面的解释是: SELECT a.id, a.name, t.agency_id, t.initial_amount, DATE_FORMAT(t.created_at, "%d.%m.%Y") as date, DATE_FORMAT(t.created_at, "%Y-%m-%d") as date_created, t.created_at, t.collection, t.pay, (t.initial_amount + t.coll
SELECT
a.id, a.name, t.agency_id, t.initial_amount,
DATE_FORMAT(t.created_at, "%d.%m.%Y") as date,
DATE_FORMAT(t.created_at, "%Y-%m-%d") as date_created,
t.created_at, t.collection, t.pay, (t.initial_amount + t.collection - t.pay) as total_amount
FROM (
SELECT
hh.agency_id, hh.amount, h0.initial_amount, hh.created_at,
SUM(IF(hh.payment_type=0,hh.amount,0)) AS collection,
SUM(IF(hh.payment_type=1,hh.amount,0)) AS pay
FROM house_register AS hh
LEFT JOIN (
SELECT h1.initial_amount, h1.agency_id, h1.created_at
FROM house_register AS h1
INNER JOIN (
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id
) AS min_id_ag
ON h1.agency_id = min_id_ag.agency_id
AND h1.id = min_id_ag.min_id
) AS h0
ON hh.agency_id = h0.agency_id
WHERE hh.created_at BETWEEN '2015-11-01' AND '2015-11-30'
GROUP BY hh.created_at, hh.agency_id WITH ROLLUP
) AS t
INNER JOIN agencies as a
on a.id = t.agency_id
所以,我在这里试图实现的是从一个表中获取一个特定时间段的报告,在这个表中,我有一个类型为statuspayment或collection的操作,每个操作对应一个agency_id存储
我的报告必须是这样的:
agency_1 2015-01-01 500 100 0
agency_2 2015-01-01 600 100 0
.... next date
agency_1 2015-01-02 600 0 150
agency_2 2015-01-02 450 0 150
etc
栏目:
agency_id date X initial_amount_of_first_transaction_of_day_in_loop sum(payments) sum(collection)
行将如下所示:
agency_1 2015-01-01 500 100 0
agency_2 2015-01-01 600 100 0
.... next date
agency_1 2015-01-02 600 0 150
agency_2 2015-01-02 450 0 150
etc
我想得到的是第一笔交易的初始金额,即每个日期的minid,该日期由代理id分组并在创建。例如,如果我在2015-01-01日期有50笔交易,我希望获得该日期第一笔交易的初始金额列的值
现在它只选择整个日期间隔的最小值。所有日期的最小值都相同
希望我说得够清楚
谢谢你的帮助
更新结构:
CREATE TABLE IF NOT EXISTS `house_register` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`created_at` date DEFAULT NULL,
`created_time` time DEFAULT NULL,
`initial_amount` decimal(14,2) DEFAULT NULL,
`document_type` tinyint(3) unsigned DEFAULT NULL,
`document_id` int(10) unsigned DEFAULT NULL,
`document_number` varchar(100) DEFAULT NULL,
`description` varchar(200) DEFAULT NULL,
`amount` decimal(14,2) DEFAULT NULL,
`final_amount` decimal(14,2) DEFAULT NULL,
`agency_id` int(11) DEFAULT NULL,
`user_id` int(10) DEFAULT NULL,
`payment_type` tinyint(1) DEFAULT NULL COMMENT '0 - incasare, 1 - plata',
`number` varchar(50) DEFAULT NULL,
`debit_account` varchar(45) DEFAULT NULL,
`credit_account` varchar(45) DEFAULT NULL,
`short_desc` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=34;
使用结果集更新查询细分:
完整的返回:
子查询1:
子查询2:请参阅注释
SELECT h1.initial_amount, h1.agency_id, h1.created_at
FROM house_register AS h1
INNER JOIN (
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id
) AS min_id_ag
ON h1.agency_id = min_id_ag.agency_id
AND h1.id = min_id_ag.min_id;
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id;
子查询3:请参阅注释
SELECT h1.initial_amount, h1.agency_id, h1.created_at
FROM house_register AS h1
INNER JOIN (
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id
) AS min_id_ag
ON h1.agency_id = min_id_ag.agency_id
AND h1.id = min_id_ag.min_id;
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id;
我相信您需要将创建的日期以天为单位添加到组中,并在日期之间添加where子句
WHERE h2.created_at BETWEEN '2015-11-01' AND '2015-11-30'
GROUP BY h2.agency_id, date_format(h2.created_at, "%Y-%b-%d")
第一行将搜索条件缩减到您想要的日期。
第二行按机构id对所有内容进行分组,然后按格式为YYY-MM-DD的created_对日期进行分组
i、 有点像我没有测试过但是
SELECT
a.id, a.name, t.agency_id, t.initial_amount,
DATE_FORMAT(t.created_at, "%d.%m.%Y") as date,
DATE_FORMAT(t.created_at, "%Y-%m-%d") as date_created,
t.created_at, t.collection, t.pay, (t.initial_amount + t.collection - t.pay) as total_amount
FROM (
SELECT
hh.agency_id, hh.amount, h0.initial_amount, hh.created_at,
SUM(IF(hh.payment_type=0,hh.amount,0)) AS collection,
SUM(IF(hh.payment_type=1,hh.amount,0)) AS pay
FROM house_register AS hh
LEFT JOIN (
SELECT h1.initial_amount, h1.agency_id, h1.created_at
FROM house_register AS h1
INNER JOIN (
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
WHERE h2.created_at BETWEEN '2015-11-01' AND '2015-11-30'
GROUP BY h2.agency_id, date_format(h2.created_at, "%Y-%b-%d")
) AS min_id_ag
ON h1.agency_id = min_id_ag.agency_id
AND h1.id = min_id_ag.min_id
) AS h0
ON hh.agency_id = h0.agency_id
WHERE hh.created_at BETWEEN '2015-11-01' AND '2015-11-30'
GROUP BY hh.created_at, hh.agency_id WITH ROLLUP
) AS t
INNER JOIN agencies as a
on a.id = t.agency_id
对不起,是的,我不得不把你的问题重读了好几遍,但我想我已经把它整理好了。这会给你你想要的结果吗 对于minh2.id选择,您还需要按h2.created_分组,而不仅仅是第18行的h2.agency_id-full group by=group by h2.agency_id,h2.created_
SELECT
a.id, a.name, t.agency_id, t.initial_amount,
DATE_FORMAT(t.created_at, "%d.%m.%Y") as date,
DATE_FORMAT(t.created_at, "%Y-%m-%d") as date_created,
t.created_at, t.collection, t.pay, (t.initial_amount + t.collection - t.pay) as total_amount
FROM (
SELECT
hh.agency_id, hh.amount, h0.initial_amount, hh.created_at,
SUM(IF(hh.payment_type=0,hh.amount,0)) AS collection,
SUM(IF(hh.payment_type=1,hh.amount,0)) AS pay
FROM house_register AS hh
LEFT JOIN (
SELECT h1.initial_amount, h1.agency_id, h1.created_at
FROM house_register AS h1
INNER JOIN (
SELECT min(h2.id) AS min_id, h2.agency_id, h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id, h2.created_at
) AS min_id_ag
ON h1.agency_id = min_id_ag.agency_id
AND h1.id = min_id_ag.min_id
) AS h0
ON hh.agency_id = h0.agency_id
WHERE hh.created_at BETWEEN '2015-11-01' AND '2015-11-30'
GROUP BY hh.created_at, hh.agency_id WITH ROLLUP
) AS t
INNER JOIN agencies as a
on a.id = t.agency_id
你的回答几乎是正确的,肯定让我走上了正确的道路。 非常感谢您的帮助和安抚@wkdmarty 这就是我想要的问题
SELECT a.id,
a.NAME,
t.agency_id,
t.initial_amount,
Date_format(t.created_at, "%d.%m.%Y") AS date,
Date_format(t.created_at, "%Y-%m-%d") AS date_created,
t.created_at,
t.collection,
t.pay,
(t.initial_amount + t.collection - t.pay) AS total_amount
FROM (
SELECT hh.agency_id,
hh.amount,
h0.initial_amount,
hh.created_at,
sum(IF(hh.payment_type=0,hh.amount,0)) AS collection,
sum(IF(hh.payment_type=1,hh.amount,0)) AS pay
FROM house_register AS hh
LEFT JOIN
(
SELECT h1.initial_amount,
h1.agency_id,
h1.created_at
FROM house_register AS h1
INNER JOIN
(
SELECT min(h2.id) AS min_id,
h2.agency_id,
h2.created_at
FROM house_register AS h2
GROUP BY h2.agency_id,
h2.created_at ) AS min_id_ag
ON h1.agency_id = min_id_ag.agency_id
AND h1.id = min_id_ag.min_id
WHERE h1.created_at BETWEEN '2015-11-01' AND '2015-11-30' ) AS h0
ON hh.agency_id = h0.agency_id
AND hh.created_at = h0.created_at
WHERE h0.created_at BETWEEN '2015-11-01' AND '2015-11-30'
GROUP BY hh.created_at,
hh.agency_id WITH rollup ) AS t
INNER JOIN agencies AS a
ON a.id = t.agency_id
ORDER BY t.agency_id,
t.created_at
可以展示你的结构!!子查询2结果:子查询3结果:我仍然得到所有日期的相同初始金额。但是它破坏了我的其他计算收集和支付。好吧,把你的查询分解成几部分,看看你得到了什么。如果您发布一个数据集,比如15行,以匹配您指定的SQL表,我将编写查询。请参阅更新的帖子和最后的注释。由于声誉不好,我无法发布更多的链接,所以我在评论中添加了其余的链接。希望能有帮助。谢谢你提供的额外信息,从我所看到的,你的结果完整的sql2返回了正确的初始金额?每个代理id的初始金额肯定是相同的吗?你能发布一个数据子集和一个你期望结果的表格吗,然后我可以完整地重新创建它。谢谢。是的,但实际上我发布了一个修改过的查询,它没有在子查询2中返回正确的值。所以这是正确的:这是由一个代理id过滤的原始表:我想要的是一个结果集,在给定的时间间隔内,每个日期,每个代理的每一天,按代理id分组,以获得当天第一笔交易的初始金额@wkdmartyExcellent,很高兴我能帮忙,很抱歉花了这么长时间。