2017-11-05 16 views
0

このような状況に遭遇していないので、修正方法がわかりません。私はサブクエリが必要と推測していますか?ジョイントテーブルで合計とカウント

votes.voteのSUMとvotes.voteのCOUNTが必要です。これにより、選択した場所の評価(すべての投票の合計/投票の数=評価)を計算することができます。

ここ

は、それが簡単に理解できるようにする*および静的バインディングを使用してクエリです:

//prepare 
$stmt = $db->prepare(" 
    SELECT SQL_CALC_FOUND_ROWS 
     *, 
     COALESCE(SUM(votes.vote),0) AS vote_total, 
     COUNT(votes.vote) AS number_votes 
    FROM locations 
    LEFT JOIN tables 
     ON tables.location_id = locations.location_id 
    LEFT JOIN votes 
     ON votes.location_id = locations.location_id 
    LEFT JOIN events 
     ON events.location_id = locations.location_id 
    WHERE locations.location_id = :location_id 
    LIMIT :limit OFFSET :offset 
"); 

//bindings 
$binding = array(
    'location_id' => 11, 
    'limit' => 20, 
    'offset' => 0 
); 

//execute 
$stmt->execute($binding); 

//results 
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); 

この場所に接合された11件のイベントがあります。それには2つの票しか加わっていません(値は3、値は4)。

別に私は votesテーブルを削除参加し、SUM/COUNTは、彼らがする必要がありますように、すべての11件の結果が示され、それを選択した場合のみ結果はむしろ11より返却されていることから、
[vote_total] => 77 (should be 7, but is 7*11) 
[number_votes] => 22 (should be 2, but is 2*11) 

:私は、次のように取得しています。

Vote.voteのSUMとCOUNTの合計を何らかの方法で同じクエリで得ることは可能ですか、それともそれらの値を取得するために別のクエリが必要になるのでしょうか?

+0

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。あなたは明らかに混乱しています。なぜなら、あなたはGROUP BYを持たない集約クエリを持っており、それは1行を返すからです。それでも、あなたは 'LIMIT'節を使用しています。 –

+0

グループは存在しないはずです...手元にある質問に関しては、サンプルのリターンが提供されました。はい、ページングが含まれているため、制限とオフセットが使用されています...この投稿のクエリはダンプされています。だから、私は私のポストで言ったように...それは可能ですか、別のクエリは、すべての結果の特定の列の合計/カウントを取得する必要があります。 – user756659

答えて

1

問題の説明に基づいて推測すると、イベントごとに1つの行が必要になるということです。もしそうなら:

SELECT SQL_CALC_FOUND_ROWS e.* 
     COALESCE(SUM(v.vote), 0) AS vote_total, 
     COUNT(v.vote) AS number_votes 
FROM locations l LEFT JOIN 
    tables 
    ON t.location_id = l.location_id LEFT JOIN 
    votes v 
    ON v.location_id = l.location_id LEFT JOIN 
    events e 
    ON e.location_id = l.location_id 
WHERE l.location_id = :location_id 
GROUP BY e.event_id 
LIMIT :limit OFFSET :offset; 
+0

はい、そのトリックでしたが、ここでevent.event_idによるグループ化が必要な理由を理解していないと思いますか?すべてのイベントは一意であり、同じevent_idを持つ2つのイベントが存在することはありません。 – user756659

+0

@ user756659 。 。コメントで説明したように、 'GROUP BY'を持たない集約クエリは正確に1つの行を返します。 'SUM()'と 'COUNT()'を使うと集約クエリになります。 –

関連する問題