贡献者有歌曲和歌曲有贡献者。我希望能够根据贡献者的歌曲数量进行排序。
在我的控制器中:
public $paginate = array(
'fields' => array(
'Contributor.id',
'Contributor.name',
'COUNT(DISTINCT ContributorsSong.song_id) AS Contributor__TotalSongs',
),
'joins' => array(
array(
'alias' => 'ContributorsSong',
'table' => 'contributors_songs',
'type' => 'LEFT',
'conditions' => 'ContributorsSong.contributor_id = Contributor.id'
),
array(
'alias' => 'Song',
'table' => 'songs',
'type' => 'LEFT',
'conditions' => 'ContributorsSong.song_id = Song.id'
)
),
'group' => array('ContributorsSong.contributor_id')
);
在我的索引方法中。
$this->Contributor->recursive = 0;
$this->Paginator->settings = $this->paginate;
$this->Contributor->virtualFields['TotalSongs'] = 0;
$items = $this->paginate();
echo '<pre>';print_r($items);echo '</pre>';
我正在尝试使用虚拟字段按歌曲数量排序,所以当我去
时本地主机/站点/贡献者/索引/排序:TotalSongs /
我收到此错误:
错误:SQLSTATE [42S22]:未找到列:1054'order clause'中的未知列'0'
SQL查询: 选择
Contributor
。id
,Contributor
。name
, COUNT(DISTINCT ContributorsSong.song_id)AS Contributor__TotalSongs 来自db_songs2
。contributors
ASContributor
LEFT JOINdb_songs2
。contributors_songs
ASContributorsSong
ON (ContributorsSong
。contributor_id
=Contributor
。id
)LEFT JOINdb_songs2
。songs
ASSong
ON(ContributorsSong
。song_id
=Song
。id
)WHERE 1 = 1 GROUP BYContributorsSong
。contributor_id
ORDER BY(0)desc LIMIT 18
我认为TotalSongs会在查询中变成Contributor__TotalSongs但会变成 0 。这里发生了什么?感谢。
答案 0 :(得分:1)
我换了:
$this->Contributor->virtualFields['TotalSongs'] = 0;
使用:
$this->Contributor->virtualFields['TotalSongs'] = 'COUNT(DISTINCT ContributorsSong.song_id)';
并删除: &#39; COUNT(DISTINCT ContributorsSong.song_id)AS Contributor__TotalSongs&#39;,
它现在适用于订购,但我无法在conditions
中使用它。我认为这是Limitations of virtualFields的一部分?我试图仅选择TotalSongs&gt;的表格。 0,但我想我可以通过将连接从LEFT更改为INNER来获得另一种方式。