3

MySQL データベースでユーザーの投票を数える方法を探しています。

テーブルと列:

companion
 - companion_id
 - news_id
 - user_id
news
 - news_id
 - user_id
user
 - user_id
 - user_name
vote
 - vote_id
 - news_id
 - user_id

SQL Fiddle Live Demoをチェックしてください

条件:

  • すべてのユーザーが複数のニュースを受け取ることができます
  • すべてのニュースは複数の投票を持つことができます
  • すべてのニュースには複数のコンパニオンを含めることができます(コンパニオンはユーザーです)
  • すべてのユーザーが複数のニュースに投票できます (このクエリでは重要ではありません)

目標:

現在、ユーザーが一緒に持っている投票数を把握しようとしています: 彼自身のニュースと、彼がコンパニオンとしてリンクされているものです。ソリューションは、単一のMySQL クエリである必要があります。

User2の例:

  • User2には1 つのニュース記事があります。このニュース記事には2票があります。
  • User21 つの記事のコンパニオンです。このニュース記事には3票があります。
  • User2には5票が必要です

アプローチ:

次のクエリの結果は 5 ではなく 31 です。これは、2 つの異なるテーブルに正しくグループ化できないためです。

SELECT   u.user_name,
         u.user_id,
         COUNT(v.vote_id) AS votes
FROM     user u,
         news n,
         companion c,
         vote v
WHERE    u.user_id = 2 AND
         (
           (
             u.user_id = n.user_id AND
             n.news_id = v.news_id
           ) OR
           (
              u.user_id = c.user_id AND
              c.news_id = v.news_id
           )
         )
GROUP BY u.user_id
LIMIT    1
4

1 に答える 1

3

参加するのではなく、団結することが鍵です。user_id を 2 回変更する必要があることに注意してください。users テーブルに自由に参加して、実際のユーザー名を取得してください。

sqlfiddleでライブで動作することを確認してください。

SELECT   u.user_name, 
         count(*)
FROM
(
         SELECT news_id,
                user_id
         FROM   news
         WHERE  user_id = 2
         UNION ALL
         SELECT news_id,
                user_id
         FROM   companion
         WHERE  user_id = 2
)        sq
JOIN     vote v 
ON       v.news_id = sq.news_id
JOIN     user u
ON       sq.user_id = u.user_id
GROUP BY sq.user_id;
于 2013-11-08T15:30:04.047 に答える