2017-12-14 6 views
2

この次のSQL文は、mysqlのクエリで動作して動作しますが、Laravelで次のコマンドを実行しようとしたときにエラーSQLSTATE[42000]: Syntax error or access violation: 1055 'dashboard.m.id' isn't in GROUP BY (SQL: SELECT m.id, ....を与える:Laravel生の選択エラー。 MySQLの

$this->builder = DB::select 
("SELECT m.id, m.member_num, m.first_name, m.last_name, COUNT(s.member_id) AS members 
FROM sessions AS s 
LEFT JOIN members AS m ON s.member_id = m.id 
WHERE s.created_at >= :dateFrom 
AND s.created_at < :dateTo 
GROUP BY s.member_id",    
['dateFrom' => "date('2017-11-01')", 
'dateTo' => "date('2017-12-01')"]); 

は、誰もがそれは、MySQLで正しく動作考慮問題を見ることができます。

私は単にsessionsのカウントを取得し、あなたはLaravelに見ているエラーがそれに関係しているsessions

答えて

2

member_idとしてリンクされているmember詳細を表示しようとしているあなたは、非集計列を選択していますGROUP BY句には現れません。 MySQLで動作した理由は、MySQLがONLY_FULL_GROUP_BYがオフになっている緩慢なモードで動作しているため、このような非標準の構文を許容するためです。私はあなたがこれらの線に沿ってクエリを使用することを目的と疑う:あなたはsessionsテーブル内のメンバーの上に集約し、そのテーブルからフィールドのみをカウントしているので

SELECT 
    m.id, m.member_num, m.first_name, m.last_name, s.member_count 
FROM members m 
LEFT JOIN 
(
    SELECT member_id, COUNT(*) AS member_count 
    FROM sessions 
    WHERE s.created_at >= :dateFrom AND 
      s.created_at < :dateTo 
    GROUP BY member_id 
) s 
    ON m.id = s.member_id 

、私は別のサブクエリで集計を行うことを提案します。次に、これをmembersに参加させて、完全なメンバーレコードを取得します。

+0

このような高速回答をいただきありがとうございます。私はあなたのクエリを削除しましたが、今は動作していますが、member_countはすべてnullですか? – yoyoma

+0

Hmmm ...サブクエリ 'SELECT member_id、COUNT(*)...'だけを実行できますか?それは何を返しますか?すべての 'member_count'がそこにも' NULL'で戻ってくるなら、あなたのデータに問題があることを意味します。 –

+0

別の考え:この結果セットをどのように_order_する予定ですか?最初に戻った少数のレコードは、カウントを持たないことが起こり得る。おそらくORDER BY句も必要です。 –

0

ONLY_FULL_GROUP_BYissueを克服するには、ANY_VALUE()を使用して非集約列を参照します。

DB::table('sessions') 
    ->join('members', 'sessions.member_id', '=', 'members.id') 
    ->select([ 
     'members.member_num', 
     'members.first_name' 
     'members.last_name', 
     DB::raw('COUNT(sessions.member_id) AS members'), 
     DB::raw('ANY_VALUE(members.id) AS id'), 
    ]) 
    ->where([ 
     ['sessions.created_at', '>=', date('2017-11-01')], 
     ['sessions.created_at', '<', date('2017-12-01')] 
    ]) 
    ->groupBy('sessions.member_id') 
    ->get(); 
+0

応答してくれてありがとう、これをすばやく試してみて、エラーANY_VALUEは存在しません – yoyoma