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


CakePHP database queries DISTINCT / GROUP BY error

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

带有"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,年龄=38,地点=英国
  • id=2,nick=阿尔伯特,年龄=60,地点=美国
  • id=3,nick=灰烬,年龄=42,地点=英国
  • id=4,nick=albert,年龄=60,地点=new_zelland

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

按冲突排序似乎是一个常见的问题。我在这个问题上找到了一些技巧。但它为本地Mysql查询提供了解决方案。我需要一个CakePHP类型查询的解决方案。

不清楚为什么要按缺口分组并按id排序。你打算使用像COUNT()这样的聚合函数来查看同一缺口出现了多少次吗?总之,我还不清楚你的总体目标。也许值得注意HAVING MySQL关键字。

更新:好的,这更有意义。因此,您需要在条件上使用子选择,或者将其表示为联接。我将尝试展示一个使用WHERE子句中的sub-select的示例。

/* 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)
));