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,很高兴我能帮忙,很抱歉花了这么长时间。