我正在开发一个用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
但我想知道是否有更好的方法,特别是因为我必须根据用户的需要对每一列进行排序。
有什么想法吗?
答案 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 --
买者:
请记住JOIN
的性质以及MySQL没有提供直接写入FULL OUTER JOIN
的方法,您会注意到如果某个year
没有LEFT JOIN
参与year
的第一个表中的任何记录,然后将从生成的最终输出中省略RIGHT JOIN
。如果我们将查询更改为year
,则将根据第二个表执行省略。但是,如果在您的情况下不会发生这种情况(即如果您认为两个表中的每个{{1}}总会有记录),您不必担心这种情况,但它仍然是很高兴意识到这个漏洞。
进一步阅读:Full Outer Join in MySQL