我有两个mysql表:
有51张唱片的People
People统计有131个记录
如果我在模型/PeopleSearch.php上设置了这个
$query->joinWith('peopleStats');GridView显示131个记录。我如何将连接设置为只获取最后一天的记录(使用MAX(date)的查询),以便GridView在每个人项上只显示51条记录和最新数据?
谢谢
发布于 2016-02-25 08:55:31
这对于ActiveDataProvider-backed GridView来说是一个常见的问题。网格需要知道数据集中有多少模型。同时,仅仅为了计算所有模型,获取和实例化它们将是极其低效的。这就是为什么ActiveDataProvider从SQL获得总模型计数的原因,假设结果集中的每一行都对应于一个模型。
现在,您已经在查询中引入了一个JOIN。这会增加结果集中的行数(从51行增加到131行)。总模型计数并不是唯一打破的东西,你也应该有一个问题的分页。请注意,您可以使用all()函数获取所有模型(就像在People::find()->joinWith('peopleStats')->all()中那样,它足够聪明地删除冗余行,因此您可以使用all()精确地得到51个模型。
现在,有几个解决办法。首先,在数据提供程序中执行joinWith()的唯一原因是需要对相关数据进行筛选或排序。如果不是这样的话,使用with()就可以了。
如果确实需要对相关数据进行筛选/排序,则还有另一种解决办法,即只从主表->select('people.*')中选择列。您仍然可以在网格视图中引用相关数据,它将只是延迟加载。
如果您的结果集很小,特别是如果您不打算使用分页,请考虑切换到ArrayDataProvider。
在您的具体情况下,我建议您只创建另一个hasOne关系,如peopleStatsLast,并在其中实现查询,该查询只为给定的人选择最后一组统计数据,然后延迟加载它。有关更多信息,请查看MySQL参考。
发布于 2016-02-25 08:40:13
应该是这个查询
$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)");发布于 2016-02-25 09:12:28
使用这个查询就像.
$query = People::find();
$query->join('LEFT OUTER JOIN', 'people_state', "people_table_id = people_state_table_id");https://stackoverflow.com/questions/35616732
复制相似问题