2012-11-02 55 views
0

我有兩個允許用戶請求歌曲的表格。當然,一首歌可以由多個用戶請求:從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.這意味着我不能處理大量的用戶,但現在應該沒問題。

+3

你怎麼從你的查詢期望返回?請發佈一個示例結果集。 – Quassnoi

回答

0

只需使用Song_Name和By_IP進行分組即可。像這樣

SELECT * FROM `songs` JOIN users GROUP BY song_name, ip 
+0

這對我不起作用,因爲我仍然需要計算任何Id的請求的總數。因此,我需要使用GROUP BY和Count()的可能性。另一方面,據我所知,JOIN只在兩個表中存在Id的情況下才連接行。 – Bernd

0

你確定你沒有超越你的解決方案嗎?如果您只想消除重複項,只需在兩列的第二張表中輸入UNIQUE索引即可。

如果您想要對GROUP BY做更復雜的操作,請按照Quassnoi的要求提供一個示例結果集。

1

目前還不清楚你想要什麼?表中沒有要求的日期。沒有日期你怎麼知道什麼時候某首歌被請求。

 

Select Songs.id, Songs.Song_name, requested_songs.By_IP 
from Songs 
INNER JOIN requested_songs 
    on Songs.id = requested_songs.Requested_id 
    Group BY requested_songs.Requested_id 
order by requested_songs.Requested_id ASC 
; 

SQLFiddle Demo:

+0

這將返回我爲某首歌曲獲得的所有請求。這意味着多行。但是我每首歌只需要一行。 – Bernd

+0

我編輯了答案。請檢查。 – Anam

+0

嗨!我不需要知道「何時」播放了歌曲,我只需要知道某個特定用戶是否已經請求了某首歌曲。要做到這一點,我輸入請求用戶的IP,將歌曲的ID輸入到第二個表格中(請參閱上文)。 – Bernd