4

データベースには、パッケージ、フィクスチャ、ディール、フィクスチャ ディールの 4 つのテーブルがあります。

テーブル構造の詳細は次のとおりです。

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' が 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

1

発生しているエラーは、MySQL 5.7 がより SQL99 に準拠するようになったためです。ここでそれについて少し読むことができますが、それには、ONLY_FULL_GROUP_BY選択されている集計されていない列がGROUP BY. これはあなたの状況にとって何を意味しますか?

これらは集約されていないため、適切に機能させるためにグループ化にp.titleandを追加するだけで済みます。tbl_min_value.min_price

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

「一体なぜそんなことをするのだろう?」と疑問に思うかもしれません。を使用GROUP BYすると、行に複数の表示可能な値があるデータを誤って「折りたたむ」ことが容易になる前に、最初の値のみを表示していました。これにより、 または などの集約関数を使用して表示したいものを把握しMIN()たり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

phpMyAdmin では SQL クエリが正常に機能しているのに、Laravel 5.3 では同じことが機能しないのは奇妙です。サンプルデータを含む db 構造を投稿していただけないでしょうか。

ところで、私は次の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 に答える