これが私のテーブルレイアウトです:
私がやりたいこと:
votes
特定の部屋のfor eachの数を数えsongID
ます (パラメーターとして渡されます)。- userID が特定の部屋の曲に対して少なくとも 1 票を持っているかどうかを調べます。UserID もパラメーターとして渡されます。
- 上記の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 |
+--------+-----------+--------+