Php 从mysql中的日期数据获取每月行数

Php 从mysql中的日期数据获取每月行数,php,mysql,mariadb,Php,Mysql,Mariadb,我有两张桌子: table 1.a id--entry_date-amount ============================ 2---2016-04-14--$400 3---2016-04-14--$400 4----2017-07-14--$200 5---2017-07-14--$500 6---2017-05-14--$600 7----2017-06-18--$100 table 2.b id--e

我有两张桌子:

 table 1.a
    id--entry_date-amount
============================
    2---2016-04-14--$400
    3---2016-04-14--$400
    4----2017-07-14--$200
    5---2017-07-14--$500
    6---2017-05-14--$600
    7----2017-06-18--$100

    table 2.b
    id--entry_date
===========================
    2---2016-04-14--$230
    3---2016-04-14--$230
    4----2017-07-14--$567
    5---2017-07-14--$600
    6---2017-05-14--$560
    7----2017-06-18--$90
    8---2016-04-14--$100
从这两张表中,我怎样才能得到montwise的计数 我期望的结果是:

month_name--total(count form table a)--total(count form table b)--amount(table a)--amount(table b)
========================================================
April,16-----------2-------------------3---$800-$500
May,17-----------1-------------------1 --$600--$700
June,17-----------2-------------------2--$100--$800
July,17-----------2-------------------2---$700-$400
这是演示数据。 我想在一个查询中按月显示两个表中的数据。 我该怎么做

我试过:

SELECT MONTHNAME(r.entry_date),r.a_total FROM( 
SELECT
IFNULL((SELECT COUNT(tr.id) AS amount FROM a AS tr WHERE MONTH(tr.entry_date)=MONTH(t.entry_date)),0) AS a_total
,t.entry_date

FROM(SELECT tr.id,tr.entry_date
 FROM a AS tr
 WHERE DATE(tr.entry_date) BETWEEN '2017-07-01' AND '2018-06-30') t

   GROUP BY MONTH(t.entry_date)) r

但简单查询需要58秒。如何在一个简单的查询中实现这一点?

您可以分别从每个表中获取计数和总和,然后使用
UNION
将两个结果集合并为一个结果集。大概是这样的:

SELECT Month_name,
  SUM(aCount) AS aCount,
  SUM(bCount) AS bCount,
  SUM(aAmount) AS aAmount,
  SUM(bAmount) AS bAmount
FROM
(
  SELECT  
    MONTHNAME(a.entry_date) AS Month_name,
    COUNT(a.id) AS aCount,
    0 AS bCount,
    SUM(a.amount) AS aAmount,
    0 AS bAmount
  FROM a
  GROUP BY MONTHNAME(a.entry_date)
  UNION ALL
  SELECT  
    MONTHNAME(b.entry_date) AS Month_name,
    0 AS aCount,
    COUNT(b.id) AS bCount,
    0 AS aAmount,
    SUM(b.amount) AS bAmount
  FROM b
  GROUP BY MONTHNAME(b.entry_date)
) AS t
GROUP BY Month_Name;

用户9131497的设计很好地体现了大局。但是,我建议用这样的方法来处理日期:

SELECT  DATE_FORMAT(entry_date, "%M,%y") AS 'Month',
        COUNT(*) AS 'aCount'
    FROM a
    GROUP BY LEFT(entry_date, 7)  -- eg, "2017-03"
试试看我的意思


请注意,这将在一年后生效。还是需要合并所有年份的一月值这就是您的解决方案和用户9131497将要做的。我的将它们分开。

谢谢你的回复。但是可以使用子查询来完成吗?哪个是贝特?联合查询还是子查询?@Fawel是的,它可以通过子查询和联接来完成。但这更好,因为这两个表之间没有关系。那个么如何才能将所有列的合计作为最后一行呢?假设在month_列的最后一行是“Total”,“aCount的最后一行6,…”。。。。像那样。我现在使用UNIONALL来获得这种类型的结果视图