我有两个mysql表:
人,共有51条记录
- ID
- 名称
- ...
人员统计,包含131条记录
- ID
- 的peopleid
- 日期
- 分
- ...
如果我在models / peopleSearch.php中设置它
$query->joinWith('peopleStats');
GridView显示131条记录。我如何设置该连接只是为每个人项目获取最后一天的记录(MAX(日期)的查询),GridView只显示包含最新数据的51条记录?
由于
答案 0 :(得分:1)
这是ActiveDataProvider
支持的GridView
的常见问题。网格需要知道数据集中有多少个模型。同时,获取和实例化所有模型只是为了计算它们将是非常低效的。这就是ActiveDataProvider
从SQL获取总模型数的原因,假设结果集中的每一行都对应一个模型。
现在,您已在查询中引入了JOIN
。这会增加结果集中的行数(在您的情况下从51到131)。总模型数不是唯一中断的,你也应该有分页问题。请注意,您可能用于获取所有模型的all()
函数(如People::find()->joinWith('peopleStats')->all()
中的功能足够智能,可以删除多余的行,因此您将获得具有all()
的51个模型。
现在,有几种解决方法。首先,在数据提供程序中执行joinWith()
的唯一原因是您需要对相关数据进行筛选或排序。如果不是这种情况,请使用with()
,你会没事的。
如果您确实需要对相关数据进行过滤/排序,则还有另一种解决方法,只选择主表->select('people.*')
中的列。您仍然可以在网格视图中引用相关数据,它只是延迟加载。
如果您的结果集很小,特别是如果您不打算使用分页,请考虑切换到ArrayDataProvider
。
在您的具体情况下,我建议您创建另一个hasOne
关系,例如peopleStatsLast
,并在其中实现仅选择给定人员的最后一组统计信息的查询,然后延迟加载它。查看MySQL reference了解详情。
答案 1 :(得分:0)
应该是这个查询
$query = People::find()->
join('LEFT OUTER JOIN', 'people_state', "people_table_id = people_state_table_id")->
where("(peopleID, date) in ( select peopleID, max(date) from peopleStats
group by peopleID)");
答案 2 :(得分:0)
使用此查询,如.....
$query = People::find();
$query->join('LEFT OUTER JOIN', 'people_state', "people_table_id = people_state_table_id");