2010-02-27 45 views
5

我有歌曲和它們的節拍每分鐘值的表,我想建立一個遵循的曲線是這樣的播放列表:訂購數據庫查詢沿曲線導致

^  . . . 
    |  .  . 
b | .   . 
p | .    . 
m | .    . 
    x--------------------> 
    time 

我意識到這是可能在單個SQL語句中不可能,但我對解決方案感興趣 - 現在,我所看到的最佳方法是選擇比必要的更多的軌道並在我的應用程序代碼(python)中排序。

+0

非常有趣的想法。雖然沒有解決方案的想法。 – 2010-02-27 21:02:37

回答

3

一個簡單的方法來做到這一點,只需要通過SQL中的BPM排序歌曲。然後,一旦在應用程序中獲得了數據,就可以從前面開始建立您的列表,並通過在開始時放置具有奇數索引的項目,甚至在末尾放置索引。這會導致BPM隨着時間的推移而升降。這種形狀取決於可用的實際BPM。

但是,如果要形成特定的曲線,首先必須定義曲線的參數。

1

記住,SQL查詢中每個查詢的高固定成本保持,我會做這樣的:

  1. 使用一個SQL查詢來獲取由長度 (有序的 歌曲列表例如, 之間X所有歌曲列表 - 秒Ÿ長,可達 至ž歌曲總一最大值)。

  2. 創建一個函數,通過從上面的曲線概述的模式中選擇歌曲,從該歌曲列表生成一個播放列表。

也許是這樣的?

function makePlaylist(array songList,int playListLength,function curve) 
    int x=songList[0].length; 
    array playList=new array();//empty array 
    int max=getHighestBpmFromList(songList);//getHighestBpmFromList implementation not shown here 
    song closestMatch; 

    while (playList.length<playListLength) 
     currentLength=song.length 
     optimalBPM=-(x-songList[0].length)^2+max;//your curve as described above 

     closestMatch=findClosestMatch(optimalBPM);//findClosestMatch would find a song 
               //in the list whose bpm is as close 
               //as possible to what the bpm 
               //should be at x on the curve 
               //(maybe binary search, since 
               //the list is sorted) 
     playList.push(closestMatch); 
     x++ 

    return playList; 
0

我的想法是加入具有單個場「時代」(包含整數1..MAX,你可以建立在運行此表)與歌曲的表,其中適當SongID一個表每個「時間」代表最接近f(時間)的bps的歌曲。 f是表示曲線的函數。然後你可以按時間排序結果並獲得曲線。

此方法不處理重複,我不知道是否很容易在SQL中實現(我不是SQL專家)。