CakePHP数据库查询DISTINCT / GROUP BY错误

时间:2012-08-27 20:29:51

标签: php mysql database cakephp cakephp-2.0

在我的CakePHP模型中,我试图从我的表中获取一些数据 我尝试使用DISTINCT,但似乎使用DISTINCT不会更改查询结果 我可以看到许多行具有相同的缺口

使用'DISTINCT Mytable.nick'

$this->Mytable->find('all',
    array(
        'fields'=> array(
            'DISTINCT Mytable.nick',
            'Mytable.age', 'Mytable.location',
        ),
        'conditions' => array('Mytable.id >=' => 1, 'Mytable.id <=' => 100),
        'order' => array('Mytable.id DESC')
));

使用'群组Mytable.nick'

$this->Mytable->find('all',
    array(
        'fields'=> array(
            'Mytable.nick',
            'Mytable.age', 'Mytable.location',
        ),
        'conditions' => array('Mytable.id >=' => 1, 'Mytable.id <=' => 100),
        'group' => 'Mytable.nick',
        'order' => array('Mytable.id DESC')
));

'Mytable.nick'

$this->Mytable->find('all',
    array(
    'fields'=> array(
            'Mytable.nick',
            'Mytable.age', 'Mytable.location',
    ),
    'conditions' => array('Mytable.id >=' => 1, 'Mytable.id <=' => 100),
    'order' => array('Mytable.id DESC')
));

编辑:看起来甚至CakePHP 2.1也无法使用DISTINCT选项。当我尝试“GROUP BY”时,它解决了我的问题。但正如您从我的查询中可以看到的,我需要在 Mytable.id 下降的情况下订购结果。当我使用GROUP BY时,当Mysql找到相关的行时,它不会占用其他行。例如。

  • id = 1,nick = mike,age = 38,location = uk
  • id = 2,nick = albert,age = 60,location = usa
  • id = 3,nick = ash,age = 42,location = uk
  • id = 4,nick = albert,age = 60,location = new_zelland

当我使用group Mytable.nick时,我在结果中看不到第4行,我看到第2行。因为当mysql第二次看到“albert”时,它并没有把它放到我的结果中。但我需要最新的“阿尔伯特”结果。这不可能吗?

Edit2:似乎按冲突排序/组是一个常见问题。我在this question找到了一些提示。但它为本机Mysql查询提供了解决方案。我需要CakePHP类型查询的解决方案。

1 个答案:

答案 0 :(得分:0)

不清楚为什么要按照昵称进行分组并按ID进行排序。您是否打算使用像COUNT()这样的聚合函数来查看同一个缺口的出现次数?总之,你的总体目标仍然不明确。可能值得了解HAVING MySQL关键字。

更新:好的,这更有意义。因此,您需要在条件上使用子选择,或者可以将其表示为连接。我将尝试使用WHERE子句中的子选择来显示示例。

/* select last occurrence for each nick (if you need one for each location )*/
SELECT nick, age, location
FROM myTable t1
WHERE id =
    (SELECT MAX(id) 
    FROM myTable t1
    WHERE t1.nick = t2.nick);

会认为这样的事情会起作用:

$this->Mytable->find('all',
    array(
    'fields'=> array(
            'Mytable.nick',
            'Mytable.age', 'Mytable.location',
    ),
    'conditions' => array('Mytable.id =' => '(SELECT MAX(id) FROM myTable t2 WHERE myTable.nick = t2.nick)', 'Mytable.id <=' => 100)
));