0

ユーザーが曲をリクエストできるようにする2つのテーブルがあります。もちろん、複数のユーザーが 1 つの曲をリクエストすることもできます。

| Id | Song_Name |       | Requested_Id |  By_IP  |
+====+===========+       +==============+=========+
| 1  |   song1   |       |      1       | 1.1.1.1 |
| 2  |   song2   |       |      1       | 2.2.2.2 |
| 3  |   song3   |       |      1       | 3.3.3.3 |
                         |      2       | 2.2.2.2 |

1 人のユーザーが曲を複数回リクエストすること (悪用) を防ぐために、もう一度リクエストしようとしているユーザーが特定の曲を既にリクエストしているかどうかを確認する必要があります。だから私はLEFT JOIN最初のテーブルと2番目のテーブルの間で、曲ごとに1行を返す行ごとGROUP BYにやっています。Id

問題:GROUP BYグループ化されていないフィールドで予測できない値を返します。それはわかっています。SELECTしかし、この IP がこのグループに存在する場合、特定の IP を含む行を返すようにするにはどうすればよいですか? IP が存在しない場合は、グループの他の行が によって返されSELECTます。

どうもありがとう!

更新:リクエストしたユーザーの数 (またはまったくないユーザー) に関係なく、曲をリストに表示する必要があります。したがって、SELECT はすべての曲に対して 1 つの行を返す必要があります。しかし、たとえば、IP 3.3.3.3 のユーザーが song1 をリクエストしようとしている場合 (これはすでに彼によってリクエストされています)、クエリは次のように返されると予想されます。

| Id | Song_Name |  By_IP  |
+====+===========+=========+
| 1  |   song1   | 3.3.3.3 |  (3.3.3.3 in case it exists, otherwise anything else)
| 2  |   song2   | 2.2.2.2 |

曲ごとのリクエストの総数も取得する必要があるため、他のリクエスト (IP) とのグループ化も必要です。したがって、Count() を使用します。

回避策:必要なことを実行するのは非常に複雑なように思われるため (可能であれば)、回避策を考えています。GROUP_CONCAT() 集計関数を使用しています。これにより、そのグループのすべての IP が「,」で区切られて表示されます。そのため、探しているものがすでに存在するかどうかを検索できます。これの唯一の欠点は、この返される文字列の (デフォルトの) 最大長が 1024 であることです。これは、大量のユーザーを処理できないことを意味しますが、今のところは問題ありません。

4

3 に答える 3

1

あなたが何を望んでいるのかはまだ不明です。テーブルに要求された日付がありません。日付なしで、特定の曲がいつリクエストされたかをどうやって知ることができますか.

Songs.id、Songs.Song_name、requested_songs.By_IP を選択します
曲から
 INNER JOIN requested_songs
    on Songs.id = requested_songs.Requested_id
    requested_songs.Requested_id でグループ化
requested_songs.Requested_id ASC 順
;

SQLFiddle デモ:

于 2012-11-02T13:59:00.853 に答える
0

Song_Name と By_IP でグループ化するだけです。このような

SELECT * FROM  `songs` JOIN users GROUP BY song_name, ip
于 2012-11-02T12:58:08.447 に答える
0

ソリューションを少し考えすぎていませんか? 重複を排除したいだけの場合はUNIQUE、2 番目のテーブルの両方の列にインデックスを配置するだけです。

その でもっと複雑なことをしようとしている場合はGROUP BY、Quassnoi が要求したように、サンプルの結果セットを提供してください。

于 2012-11-02T13:03:42.827 に答える