0

次の 3 つのテーブルがあるとします。

  • td_idea

    +----------+--------------+----------------------+ ------------------+
    | | idea_id | アイデア名 | idea_submitter_id | アイデア_ステータス |
    +----------+--------------+----------------------+ ------------------+
    | | 1 | シャツ | 3 | デザイン |
    | | 2 | トップ | 1 | カラー |
    +----------+--------------+----------------------+ ------------------+
    
  • td_idea_contribution

    +------------------+------------+------------------ +
    | | 貢献_id | idea_id | submitter_id |
    +------------------+------------+------------------ +
    | | 1 | 1 | 3 |
    | | 2 | 1 | 4 |
    | | 3 | 1 | 7 |
    | | 4 | 1 | 10 |
    | | 5 | 2 | 3 |
    | | 6 | 2 | 10 |
    +------------------+------------+------------------ +
    

    この表は、特定のアイデアに対してユーザーが行った貢献を示しています。

  • td_idea_contribution_like

    +---------------------+--------------------+----------------- +
    | | like_id | 貢献_id | submitter_id |
    +---------------------+--------------------+----------------- +
    | | 1 | 1 | 1 |
    | | 2 | 1 | 4 |
    | | 3 | 2 | 24 |
    | | 4 | 1 | 73 |
    | | 5 | 4 | 124 |
    | | 6 | 2 | 34 |
    | | 7 | 1 | 75 |
    | | 8 | 3 | 124 |
    +---------------------+--------------------+----------------- +
    

idea_id特定の のすべての投稿を表示し、それぞれがリストされた各投稿の投票数を表示したいと考えています。

したがって、idea_id = 1次の出力を確認したいと思います。

+--------------------+------------------+----------------------- ---+
| | 貢献_id | 合計いいね数 | ユーザー ID |
+--------------------+------------------+----------------------- ---+
| | 1 | 4 | 3 |
| | 2 | 2 | 4 |
| | 3 | 1 | 7 |
| | 4 | 1 | 10 |
+--------------------+------------------+----------------------- ---+

現在、次のクエリを使用していますが、奇妙な結果が表示されています。

SELECT   td_idea.idea_id,
         td_idea_contribution.contributuion_id,
         td_idea_contribution.submitter_id,
         COUNT(td_idea_contribution_like.contribution_like_id) AS tot_like
FROM     td_idea, td_idea_contribution, td_idea_contribution_like
WHERE    td_idea.idea_id = td_idea_contribution.idea_id 
     AND td_idea_contribution.contribution_id = td_idea_contribution_like.contribution_id
     AND td_idea.idea_id = '$id'
     AND td_idea.status LIKE '%Design%'
ORDER BY tot_like DESC

編集

エラーは発生しません。次のように、1 つのレコードを含む異常な結果が返されるだけです。

+--------------------+------------------+----------------------- ---+
| | 貢献_id | 合計いいね数 | ユーザー ID |
+--------------------+------------------+----------------------- ---+
| | 1 | 8 | 3 |
+--------------------+------------------+----------------------- ---+
4

3 に答える 3

1

GROUP BY(Aggregate) Functionsに記載されているとおり:

GROUP BY句を含まないステートメントでグループ関数を使用すると、すべての行をグループ化することと同じになります。

これがあなたの場合に起こっていることです。それを防ぐには、結果を次のようにグループ化する必要があります。contribution_id

SELECT   contribution_id,
         COUNT(*) AS total_likes,
         c.submitter_id AS user_id
FROM     td_idea                   i
    JOIN td_idea_contribution      c USING (        idea_id)
    JOIN td_idea_contribution_like l USING (contribution_id)
WHERE    idea_id = 1
     AND idea_status LIKE '%Design%'
GROUP BY contribution_id
ORDER BY total_likes DESC

sqlfiddleで参照してください。

于 2013-05-24T10:13:22.887 に答える