我有兩個允許用戶請求歌曲的表格。當然,一首歌可以由多個用戶請求:從GROUP BY組中選擇包含特定內容的行
| 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 |
爲了防止一個用戶從請求的歌曲多次(虐待),我需要檢查是否某一首歌已經被用戶請求哪個只是試圖再次請求它。所以我在第一個和第二個表之間做一個LEFT JOIN
,在行的Id
上做一個GROUP BY
,它爲每首歌曲返回一行。
問題:GROUP BY
在未分組的字段上返回不可預知的值。這是已知的。但是如何確保SELECT
返回包含特定IP的行,以防該組存在此IP?如果IP不存在,該組的任何其他行可以通過SELECT
返回。
非常感謝!
更新:我需要在列表中顯示歌曲,而不管有多少用戶(或甚至沒有)請求它。所以SELECT絕對需要爲每首歌曲返回一行。但是,在這情況下,例如IP地址爲3.3.3.3試圖要求鬆1(這是已經被他所要求的)的用戶,我希望查詢返回的:
| 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.這意味着我不能處理大量的用戶,但現在應該沒問題。
你怎麼從你的查詢期望返回?請發佈一個示例結果集。 – Quassnoi