0

これが私のテーブルレイアウトです:

データベース レイアウトのスクリーンショット

私がやりたいこと:

  1. votes特定の部屋のfor eachの数を数えsongIDます (パラメーターとして渡されます)。
  2. userID が特定の部屋の曲に対して少なくとも 1 票を持っているかどうかを調べます。UserID もパラメーターとして渡されます。
  3. 上記の2つの拡張。曲に投票がない場合、それらのエントリには 0 を返したいと思います。

私が持っているもの:

select a.SongID, count(*) as voteCount, b.UserID 
  from votes a left join votes b 
    on a.songID = b.songID 
   and b.RoomID = 178 
   and b.UserID = 71 
 where a.RoomID = 178 
 group by a.SongID, b.UserID

RoomID(例ではそれらとUserID数字を自由に使用してください)

上記の SQL ステートメントは 1 と 2 を実行しますが、3 は実行しません。3 を実行するように拡張する方法はありますか? これらすべてを 1 つのクエリで実行できると便利です。現在、投票のあるすべての曲、投票数、およびUserID問題の曲に投票したかどうか (そうでない場合は null) を返します。前もって感謝します。

少し明確にするために、現在、このステートメントはテーブルにエントリがある曲のみを出力します。votesテーブルにエントリがない曲を含めるように変更しようとしていvotesます (つまり、 にすべての曲を含めるSelect SongID from songs where RoomID = 178)。また、すべてが部​​屋固有であることにも留意してください。曲は によって特定の部屋に一致しSongIDます。

たとえば、ここに私の歌のテーブルがあります:

+--------+--------+
| SongID | RoomID |
+--------+--------+
|   2835 |    178 |
|   2836 |    178 |
|   2837 |    178 |
|   2838 |    178 |
|   2839 |    178 |
|   2840 |    178 |
|   2841 |    178 |
|   2842 |    178 |
|   2843 |    178 |
|   2844 |    178 |
|   2845 |    178 |
|   2846 |    178 |
|   2847 |    178 |
|   2848 |    178 |
+--------+--------+

投票は次のとおりです。

+--------+--------+--------+
| SongID | UserID | RoomID |
+--------+--------+--------+
|   2835 |     71 |    178 |
|   2836 |     71 |    178 |
|   2837 |     71 |    178 |
|   2838 |     71 |    178 |
|   2839 |     71 |    178 |
|   2840 |     71 |    178 |
|   2841 |     71 |    178 |
|   2842 |     71 |    178 |
+--------+--------+--------+

最後に、これまでのクエリの結果:
最初の 7 曲だけに投票があり、それらだけが返されます。このクエリを変更して、投票がない場合でも、部屋にあるすべての曲を含めるようにします (投票数を 0 または null として返します)。

+--------+-----------+--------+
| SongID | voteCount | UserID |
+--------+-----------+--------+
|   2835 |         1 |     71 |
|   2836 |         1 |     71 |
|   2837 |         1 |     71 |
|   2838 |         1 |     71 |
|   2839 |         1 |     71 |
|   2840 |         1 |     71 |
|   2841 |         1 |     71 |
+--------+-----------+--------+
4

1 に答える 1

1

あなたのクエリは次のようになると思います

SELECT s.SongID, 
       COALESCE(v.allVotes, 0) allVotes, 
       COALESCE(v.userVotes, 0) userVotes
  FROM songs s LEFT JOIN 
(
  SELECT SongId, 
         COUNT(*) allVotes,
         SUM(CASE WHEN UserID = 71 THEN 1 ELSE 0 END) userVotes
    FROM votes
   WHERE RoomID = 178 
   GROUP BY SongID
) v 
    ON s.songID = v.songID 
 WHERE s.RoomID = 178 

これがSQLFiddleのデモです

于 2013-08-27T05:42:51.130 に答える