CakePHP 2.1选择Distinct字段但仍然在SQL表中选择ID

时间:2012-07-14 12:12:30

标签: mysql cakephp-2.1 distinct-values

嗨我在我的新闻网站上制作了一个画廊,但我的投资组合有一个小故障。 我正在尝试选择一个独特的图库,以便它不会重复,这是我到目前为止的代码

function viewgalleries() {

    $viewgalleries = $this->Gallery->find('all', array(
        'fields' => 'DISTINCT Gallery.gallery_name'));
    if (!empty($this->request->params['requested'])) {
return $viewgalleries; }
    $this->set('gallery', $viewgalleries); 

}

这是我的观点..

     <?php $viewgalleries = $this->requestAction('/Galleries/viewgalleries');?>

    <div class="allgalleries">

 <table class="galleries">
<?php foreach ($viewgalleries as $galleries): ?>
    <tr>
       <td>
         <span class="gallerylink">
            <?php echo $this->Html->link($galleries['Gallery']['gallery_name'], 
                  array('controller' => 'Gallery', 'action' => 'view', 
                  $galleries['Gallery']['id'])); ?>
         </span>
       </td>
    </tr>
  <?php endforeach; ?>
  </table>
    </div>

这给了我想要的但是它不是在表中选择id字段所以它给我这个错误......

  Notice (8): Undefined index: id [APP/View/Galleries/viewgalleries.ctp, line 10]

下面它确实显示了画廊的名称       2012年欧洲冠军联赛决赛

关于我如何仍然可以从数据库中选择id的任何想法?

提前致谢或任何帮助。

3 个答案:

答案 0 :(得分:0)

更改查找中的fields键,如下所示:

'fields' => array('DISTINCT Gallery.gallery_name', 'Gallery.id')

你也可以试试:

$this->ModelName->query('SELECT 
                 DISTINCT Gallery.gallery_name,
                 Gallery.id 
                 FROM kickoff.galleries
                 AS Gallery WHERE 1 = 1');

还有另一种解决方法可以解决您的问题。一个查询构造为 以下将产生与SELECT DISTINCT相同的结果集:

select * from TABLE group by FIELDNAME having count(FIELDNAME)>=1;

所以在你的情况下它应该是:

   SELECT Gallery.id, Gallery.gallery_name
   FROM kickoff.galleries 
   GROUP BY Gallery.gallery_name 
   HAVING COUNT(Gallery.gallery_name)=>1

但请记住,COUNT()不计算NULL值,因此如果您通过具有NULL值的字段计算值,则COUNT()不会计算这些行。这里最好的选择是在表声明中使用“NOT NULL”。

答案 1 :(得分:0)

尝试更改find​​中的fields参数键,如下所示:

'fields' => array('DISTINCT Gallery.gallery_name, Gallery.id')

这对你有用。请问它是否有效。

答案 2 :(得分:0)

而不是使用select distinct函数,因为它被证明是相当棘手的我决定重新格式化我的画廊我添加验证技术如isUnique以便允许传递相同的图库名称,这是在使用以下语句的Models / Gallery.php:

public $validate = array(
    'gallery_name' => array(
        'rule' => 'isUnique',
        'message' => 'This gallery already exists.'));

希望这有助于其他人。