【问题标题】:Mysql(GroupBy) alternative for Postgresql?Postgresql 的 Mysql(Group By) 替代品?
【发布时间】:2017-08-24 09:20:32
【问题描述】:

我正在使用 laravel 和 mysql..

我有这样的查询..

$mix = Ergebnisse::where(function($q) use($result) {               
    foreach ($result as $item) {
         $q->orWhere(function($q) use($item) {
             $q->where('temperatur', $item->temperatur)
               ->where('zeit', $item->zeit);
        });
    }
})->groupBy('katogorie_id')->get();

在我的本地主机上它工作正常,因为我在那里使用 mysql。 但我使用 Postgresql 将项目部署在 Heroku 上。

我遇到了一个错误..

SQLSTATE[42803]: Grouping error: 7 ERROR: column "ergebnisse.id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select * from "ergebnisse" where (("temperatur" = $1 and "ze...
^ (SQL: select * from "ergebnisse" where (("temperatur" = 85 and "zeit" = 35) or ("temperatur" = 85 and "zeit" = 30)) group by "katogorie_id")

经过进一步搜索,我知道 GroupBy 与 postgre 不兼容。还有其他方法吗?谢谢

【问题讨论】:

  • GroupBy is not compatible with postgre 有趣为什么?因为纯 SQL GROUP BY 与 postgresql 很好地兼容。
  • 正如@Lukasz Kaminski 评论的那样,它实际上与Mysql 有点不同..
  • 你想为一组katogorie_id获取哪一行? (MySQL 的回答:err,你没有指定,所以我只是把随机的东西放在那里——PostgreSQL 的回答:你没有指定,所以这是一个错误。正确你的错误,我们可以再谈谈)。
  • 我不想要重复的 katogories,所以 yim 只将 katogorie:id 放在 groupby 中。现在我将我的表的 id 与 katogorie id 像这样.. ->GroupB('id', 'katogorie')..但它显示了多个 katogories

标签: php mysql postgresql laravel eloquent


【解决方案1】:

SELECT *GROUP BY katogorie_id。简而言之,您需要对您正在选择的所有列进行分组。这与接受非标准 GROUP BY 用法的 MySQL 旧行为形成对比。

所以要么添加更多的列到你的组中,要么选择更少的列(我怀疑你需要SELECT *)。

【讨论】:

  • 您好,感谢您的评论。实际上我只需要按 katogorie_id 对其进行分组。你能给我一些其他的解决方案吗?
  • 我认为SELECT DISTINCT ON (katogorie_id) * 将给出与 MySQL GROUP BY 相同的结果。我不太熟悉 MySQL 旧 GROUP BY 如何确切地 决定要返回哪些行。
  • ->distinct()->get(['katogorie_id']);这东西解决了我的问题..谢谢
【解决方案2】:

感谢所有帮助我的人。我解决了这个问题

 ->distinct()->get(['katogorie_id']);

完整查询-

$result=Ergebnisse::where('name_id', $nam)->where('geometrie_id', $geo)->orWhere('name_id', $nam2)->orWhere('geometrie_id', $geo2)->get();


          $mix = Ergebnisse::where(function($q) use($result) {               
        foreach ($result as $item) {
             $q->orWhere(function($q) use($item) {
                 $q->where('temperatur', $item->temperatur)
                   ->where('zeit', $item->zeit);
            });
        }
    })->distinct()->get(['katogorie_id']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多