Laravel 5.2中的MySQL摘要查询

时间:2017-02-28 17:47:25

标签: php mysql laravel-5

我正在开发一个用Laravel 5.2编写的项目,该项目有两个表需要查询,以生成按年创建的记录数量的摘要。以下是带有一些示例数据的模式的简化布局:

事项表

2

备注表

id  created_at
-----------------
1   2016-01-05 10:00:00
2   2016-03-09 11:00:00
3   2017-01-03 10:00:00
4   2015-05-06 11:00:00

每个表都有几十万个记录,所以我希望能够(有效地)查询我的数据,以便按年份每个表的计数产生以下结果:

id  created_at
-----------------
1   2015-07-08 10:00:00
2   2016-03-16 11:00:00
3   2017-09-03 10:00:00
4   2017-11-06 11:00:00

我需要每列都可以排序。目前,我能想到的最快的方法是使用以下两个查询,然后通过PHP结合两者的结果:

year    matters     notes
----------------------------
2015    1           1
2016    2           1
2017    1           2

但我想知道是否有更好的方法,特别是因为我必须根据用户的需要对每一列进行排序。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

可以使用year位在表(及其各自的结果集)之间创建JOIN,以生成可以通过任何选择的字段进一步排序的组合输出:

SELECT t1.year_rec, IFNULL(t1.matters, 0) AS matters, IFNULL(t2.notes, 0) AS notes
FROM
    (
        SELECT DATE_FORMAT(created_at,  "%Y" ) AS year_rec, COUNT(id) AS matters
            FROM matters
        GROUP BY year_rec 
    ) t1
    LEFT JOIN 
    (
        SELECT DATE_FORMAT(created_at,  "%Y" ) AS year_rec, COUNT(id) AS notes
            FROM notes
        GROUP BY year_rec
    ) t2
ON t1.year_rec = t2.year_rec
--  ORDER BY --

Demo

买者:

请记住JOIN的性质以及MySQL没有提供直接写入FULL OUTER JOIN的方法,您会注意到如果某个year没有LEFT JOIN参与year的第一个表中的任何记录,然后将从生成的最终输出中省略RIGHT JOIN。如果我们将查询更改为year,则将根据第二个表执行省略。但是,如果在您的情况下不会发生这种情况(即如果您认为两个表中的每个{{1}}总会有记录),您不必担心这种情况,但它仍然是很高兴意识到这个漏洞。

进一步阅读:Full Outer Join in MySQL