Laravel和CTE的

时间:2019-10-03 16:22:40

标签: laravel mariadb common-table-expression laravel-6 mariadb-10.4

我正在尝试使用taudenmeirs的laravel-cte软件包将以下SQL查询转换为Laravel代码。

WITH `cte` AS (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY channel_id ORDER BY created_at DESC) AS row_number
      FROM `Videos`
)
SELECT `Channels`.*, `cte`.*
FROM `Channels`
LEFT JOIN `cte`
       ON `Channels`.`id` = `cte`.`channel_id`
WHERE `cte`.`row_number` = 1;

问题是我不断从服务器收到以下响应:

  

Illuminate \ Database \ QueryException:SQLSTATE [42000]:语法错误或   访问冲突:1140 GROUP列混合   没有GROUP列的(MIN(),MAX(),COUNT(),...)是非法的   是没有GROUP BY子句(SQL:cte as(select ,ROW_NUMBER()OVER   (PARTITION BY channel_id ORDER BY created_at DESC)AS row_number from   视频)中选择频道。从左侧频道中加入   文件中的Channels.id = cte.channel_id,其中cte.rn = 1)   /Users/mark/Workspace/api.site/vendor/laravel/framework/src/Illuminate/Database/Connection.php   在第665行

1 个答案:

答案 0 :(得分:0)

我实际上是从taudenmeirs那里得到这个答案的,我在github上以bug的形式提交了这个问题。原来,该错误是由MariaDB中的错误引起的:https://jira.mariadb.org/browse/MDEV-17785

默认情况下,Laravel中启用了ONLY_FULL_GROUP_BY模式。您可以通过在config / database.php文件中设置'strict' => false来禁用它。

这确实可以解决问题。但是,最好由Maria的优秀人才解决潜在的错误。