【问题标题】:CakePHP database queries DISTINCT / GROUP BY errorCakePHP 数据库查询 DISTINCT / GROUP BY 错误
【发布时间】:2012-08-27 20:29:50
【问题描述】:

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

'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')
));

'group 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:似乎 order by/group by 冲突是一个常见问题。我在this question 中找到了一些提示。但它为本地 Mysql 查询提供了解决方案。我需要一个 CakePHP 类型查询的解决方案。

【问题讨论】:

  • 认为这里有答案:stackoverflow.com/questions/1718482/…
  • 谢谢。我编辑了以下错误的问题。
  • 听起来您需要对返回的每个字段进行 GROUP BY 以防止仅对“nick”进行分组。
  • @ficuscr 对不起,我没听懂..
  • 我认为您提供的链接显示了返回与 order/group by 一起使用的有限偏移量时增加的复杂性。我不认为你面临同样的障碍。即使使用 Cake,您尝试做的事情也应该是可能的。也就是说,当我不得不使用那个“框架”时,最终得到的结果不止几个$db-&gt;rawQuery()

标签: php mysql database cakephp cakephp-2.0


【解决方案1】:

不清楚为什么要按 nick 分组并按 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)
));

【讨论】:

  • 将我的组行更改为 'group' => array('Mytable.nick', 'Mytable.age', 'Mytable.location')删除组线给出相同的结果。
  • 这是一个登录表。我将用户的每次登录记录到此表中。有时我需要查询用户。我想知道用户的最新位置、年龄等。用户在每次登录时可以有不同的位置。所以我需要每个用户的最新记录。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多