【问题标题】:Laravel eloquent query with double entries, group by dosn't workLaravel 雄辩的查询,双条目,分组不起作用
【发布时间】:2019-11-20 15:16:22
【问题描述】:

我在 Laravel-6.x 中构建了一个查询,但得到了重复的条目。

public function get()
{


    $catArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45'];

    $platformArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15'];

    $regionArr = ['1', '2', '3', '4', '5', '6', '7'];

    $languageArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26'];


    return Product::join('category_product', 'category_product.product_id', '=', 'products.id')
        ->join('product_region', 'product_region.product_id', '=', 'products.id')
        ->join('language_product', 'language_product.product_id', '=', 'products.id')
        ->whereIn('category_product.category_id', $catArr)
        ->whereIn('products.platform_id', $platformArr)
        ->whereIn('product_region.region_id', $regionArr)
        ->whereIn('language_product.language_id', $languageArr)
        ->groupBy('products.id')
        ->paginate(18);
}

这是一个简单的 SQL 语句

SELECT * from `products` inner join `category_product` on `category_product`.`product_id` = `products`.`id` inner join `product_region` on `product_region`.`product_id` = `products`.`id` inner join `language_product` on `language_product`.`product_id` = `products`.`id` where `category_product`.`category_id` IN (1,2,3,4,5,6,7,8,9) and `products`.`platform_id` IN (10) and `product_region`.`region_id` IN (1,2,3,4,5,6,7) and `language_product`.`language_id` IN (26) LIMIT 20

我想我必须添加 GROUP BY。但是 HeidiSQL 返回一个错误:

Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'shopdb.products.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

enter image description here

有什么办法吗?

【问题讨论】:

  • 你试过SELECT DISTINCT(*)吗?
  • 或者只是改变你的sql_mode

标签: sql laravel percona heidisql


【解决方案1】:

因为这是你mysql中sql_mode=only_full_group_by的问题

关于sql_mode的模式很少

尝试更改您的sql_mode

本地设置

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

全局设置

set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

或者更改my.cnf文件:

[mysqld][mysql]下面添加这一行

SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

然后重启mysql。

PS:您的代码的另一个问题。不要从所有这些表中选择所有字段,这会花费时间,并且最后一个表的id 将覆盖之前的 id。选择您想要的那些字段,如果名称重复,请使用AS 到另一个名称

        ->groupBy('products.id')
        ->selectRaw('products.*, category_product.id AS cp_id')
        ->paginate(18);

使用 ANY_VALUE

或者您可以在列中使用 any_value:

        ->groupBy('products.id')
        ->selectRaw('ANY_VALUE(products.id),..., category_product.id AS cp_id')
        ->paginate(18);

禁用严格模式

或者你可以禁用严格模式到 config/database.php

'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            ...
            'strict' => false,
        ],

【讨论】:

  • 非常感谢!我从 putty 编辑我的 mysql 服务器上的 sql_mode。我删除了“NO_AUTO_CREATE_USER”。 >> 设置@@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
  • @Maaaxi 好像没问题。重要的是去掉ONLY_FULL_GROUP_BY,你可以试试。这只是本地命令。
  • @Maaaxi 在运行该 cmd 之前,您可以输入 SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode; 以查看它原来的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2015-01-02
相关资源
最近更新 更多