2010-02-27 13 views
5

ho una tabella di canzoni ed i loro battiti al minuto valori, e vorrei costruire le playlist che seguono una curva simile a questo:query di database Ordina i risultati lungo una curva

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

Mi rendo conto che questo è probabilmente non è possibile in una singola istruzione SQL, ma sono interessato a sentire le soluzioni - in questo momento, l'approccio migliore che vedo è selezionare più tracce del necessario e ordinare nel mio codice applicazione (python).

+0

Idea molto interessante. Nessuna idea sulla soluzione però. –

risposta

3

Un modo semplice per farlo sarebbe quello di ordinare i brani semplicemente tramite il loro BPM in SQL. Quindi, una volta che hai i dati nella tua applicazione, crea il tuo elenco dalla parte anteriore e posteriore posizionando gli elementi con un indice dispari all'inizio e persino un indice alla fine. Ciò farebbe aumentare e diminuire il BPM nel tempo. La forma di questo dipenderà dai BPM effettivi disponibili.

Tuttavia, se si desidera formare una curva specifica, è necessario definire i parametri della curva.

1

Tenendo presente che query SQL hanno elevati costi fissi per query, lo farei in questo modo:

  1. uso di una query SQL per ottenere un elenco di canzoni che sono ordinate per lunghezza (per esempio, un elenco di tutti i brani tra x - lungo y secondi fino ad un massimo di z canzoni in totale).

  2. creare una funzione che generi una playlist da tale elenco di brani, selezionando brani da esso in un modo che segue lo schema delineato dalla curva sopra.

Forse qualcosa del genere?

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

La mia idea è quella di partecipare a una tabella che ha un solo campo "Time" (che contiene numeri interi 1..MAX, è possibile costruire questa tabella al volo) con tavolo della canzone, dove il SongID appropriato per ogni "Ora" rappresenta la canzone con bps più vicino a f (tempo). f è la funzione che rappresenta la curva. Quindi puoi ordinare il risultato per tempo e ottenere la curva.

Questo metodo non si occupa dei duplicati e non so se è facile da implementare in SQL (non sono un esperto SQL).

Problemi correlati