2

所以我在 Drupal 中有这个 sql 代码:

$query = db_query('SELECT wpv.nid, n.title, AVG(vote) average FROM {wp_votes} wpv
    LEFT JOIN {node} n on wpv.nid = n.nid
    GROUP BY wpv.nid
    ORDER BY average DESC
    LIMIT 3');

它工作得很好,但我需要用 db_select 编写它:

$query2 = db_select('wp_votes','wpv');
$query2->join('node','n','wpv.nid = n.nid');
$query2->fields('wpv',array('nid','vote'));
$query2->fields('n',array('title'));
$rez = $query2->execute()->fetchAll();

我的问题是我不知道如何获得平均票数(票数是 1,2 或 3)。我如何用 AVG(vote) 重写部分。我尝试使用 addEXpression('AVG(vote)') 但它没有按预期工作,我得到了所有条目的平均值,而不仅仅是那些具有相同 ID 的条目。

谢谢。

4

2 回答 2

2

好像忘记用了 $query->groupBy('wpv.nid');

这就是您获得所有记录的 AVG 的原因。

于 2012-04-11T13:06:51.990 回答
2

对于 AVG,您需要使用addExpression()和 groupBy,您将拥有类似这样的内容

<?php
$query2 = db_select('wp_votes','wpv');
$query2->join('node','n','wpv.nid = n.nid');
$query2->fields('wpv',array('nid','vote'));
$query2->fields('n',array('title'));
$alias = $query2->addExpression('AVG(vote)', 'average');
$query2->groupBy('wpv.nid');
$query2->sortBy($alias, 'DESC');
$rez = $query2->execute()->fetchAll();

我不确定按 $alias 排序,但理论上它应该可以工作。

于 2012-04-11T16:36:48.993 回答