我有一个表结构
id group name points
1 1 a 10
2 1 b 9
3 2 c 7
依旧......
我正在编写一个查询,它为我提供了一系列名称,并为group
匹配值的所选行的所有点提供了平均值
for group_list = [1]想要这样的结果[姓名:[' a',' b'],中位数:[9.5]]
我试过这样的
$group_list = [1];
createQueryBuilder()
->select('x.name as name, x.AVG(points) as median')
->from('myTable', 'x')
->where('x.group IN(:groupList)')
->setParameter('groupList', $group_list)
->getQuery()
->getResult();
需要一些帮助
答案 0 :(得分:1)
您将2个不同的要求合并到一个sql语句中,这会导致问题。
点数的平均值是每组或每个记录的单个值,而名称是列表。您可以通过重复名称之间的平均值将2组合成单个查询,但是,它只会产生开销。
我只是运行一个查询来获取用户名列表,另一个用于获取平均点数(按组或按所有组分组,这个问题不明确。)
这个解决方案非常简单,我认为我不需要提供任何代码。
或者,您可以使用MySQL的group_concat()函数将每个组的名称列表以逗号分隔列表的单个值(您可以使用任何其他分隔符代替逗号)。在这种情况下,在单个查询中组合2更为值得:
select group_concat(`name`) as names, avg(`points`) as median
from mytable
where `group` in (...)
如果您需要来自多个组的名称,请将组字段添加到select和group by列表中:
select `group`, group_concat(`name`) as names, avg(`points`) as median
from mytable
where `group` in (...)
group by `group`
答案 1 :(得分:0)
您应该按
添加一个组 ->groupBy('x.`group`')