4

我在数据库中有四个表,即 Packages、Fixtures、Deals 和 Fixtures Deals。

以下是表结构详细信息:

Packages: id, title
Fixtures: id, package_id, name
Deals: id, discound, description
Fixtures_Deal: id, fixture_id, deal_id, price

我需要获取包列表以及每个包的每个夹具中提供的最低交易价格。

这是我在 phpMyAdmin 或 SQLYog 中运行的 mysql 查询,它运行良好,但在 Laravel 中它给了我“p.title' is not in GROUP BY”错误。

SELECT 
  p.title AS package_title,      
  tbl_min_value.min_price AS min_price 
FROM
  (SELECT 
    fixture_id,
    MIN(deal_price) AS min_price 
  FROM
    fixture_deal 
  GROUP BY fixture_id) AS tbl_min_value 
  JOIN fixtures AS f 
    ON f.id = tbl_min_value.fixture_id 
  RIGHT JOIN packages AS p 
    ON f.package_id = p.id 
GROUP BY p.id 

顺便说一句,我试图通过在模型中使用以下方法来实现它:

return DB::statement('SELECT 
      p.title AS package_title,      
      tbl_min_value.min_price AS min_price 
    FROM
      (SELECT 
        fixture_id,
        MIN(deal_price) AS min_price 
      FROM
        fixture_deal 
      GROUP BY fixture_id) AS tbl_min_value 
      JOIN fixtures AS f 
        ON f.id = tbl_min_value.fixture_id 
      RIGHT JOIN packages AS p 
        ON f.package_id = p.id 
    GROUP BY p.id');
4

3 回答 3

2

通过使用 Eloquent Collection 的方法,我找到了另一种mapWithKeys方法。

https://laravel.com/docs/5.3/collections#method-mapwithkeys

所以我分别获取了两个查询的数据,并将两个集合与键映射到一个集合对象中。

示例代码:

$packages = Package::getPackages();

$deal_min_price = Deal::getMinimumPrice();

$packages_with_price = $packages->mapWithKeys(function ($packages) use ($deal_min_price) {
    return $packages['price'] => $deal_min_price['min_price'];
});

您可以foreachmapWithKey's closure.

于 2016-11-24T09:20:57.590 回答
1

您得到的错误是因为 MySQL 5.7 移动到更符合 SQL99。您可以在此处阅读一些相关信息,但它涉及一个名为的 SQL 模式设置,该设置ONLY_FULL_GROUP_BY可确保选择的任何非聚合列都在GROUP BY. 这对您的情况意味着什么?

好吧,您只需要添加p.titletbl_min_value.min_price到分组中即可使其正常工作,因为它们没有聚合:

GROUP BY p.id, p.title, tbl_min_value.min_price

您可能想知道,“他们到底为什么要这样做?”。好吧,使用GROUP BY, 在很容易意外地“折叠”数据之前,如果一行有多个可能的值,它可以显示,所以它只显示第一个。这使您可以使用聚合函数(例如MIN()or )确定要显示的内容MAX(),或者将其添加到表示您希望将它们分开的分组中。

如果你不喜欢它的工作方式,你可以这样做暂时禁用它:

# Run this query and copy the values
SELECT @@sql_mode;

# Remove "ONLY_FULL_GROUP_BY" and paste it in here where the XXX is
SET sql_mode = 'XXX';

my.cnf或者,您可以通过在这样的部分下编辑文件来使该更改永久化[mysqld],其中 XXX 是SELECT @@sql_mode;减去 ONLY_FULL_GROUP_BY 部分的输出:

[mysqld]
sql_mode=XXX 
于 2016-11-21T20:15:24.587 回答
0

奇怪的是,SQL 查询在 phpMyAdmin 中运行良好,但在 Laravel 5.3 中却无法正常运行。你会发布带有示例数据的数据库结构,让我们看看吗?

顺便说一句,我尝试了以下 SQL 并且在以下环境中运行良好Laravel 5.2

SELECT 
  p.title AS package_title,      
  tbl_min_value.min_price AS min_price 
FROM
  (SELECT 
    fixture_id,
    MIN(deal_price) AS min_price 
  FROM
    fixtures_deal 
  GROUP BY fixture_id) AS tbl_min_value 
  JOIN fixtures AS f 
    ON f.id = tbl_min_value.fixture_id 
  RIGHT JOIN packages AS p 
    ON f.package_id = p.id 
GROUP BY p.id 
于 2016-11-22T11:19:06.233 回答