2010-02-27 20 views
5

tengo una mesa de canciones y sus latidos por minuto valores, y me gustaría construir listas que siguen una curva como esta:consulta de base de datos Ordenar los resultados a lo largo de una curva

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

Comprendo que esto es probablemente no sea posible en una sola declaración SQL, pero estoy interesado en escuchar soluciones; en este momento, el mejor enfoque que veo es seleccionar más pistas de las necesarias y ordenar en mi código de aplicación (python).

+0

Idea muy interesante. Sin embargo, no tengo idea de la solución. –

Respuesta

3

Una manera simple de hacer esto sería simplemente ordenar las canciones por su BPM en el SQL. Luego, una vez que tenga los datos en su aplicación, construya su lista desde el frente y atrás colocando elementos con un índice impar al principio e incluso un índice al final. Eso provocaría que el BPM subiera y bajara con el tiempo. La forma de esto dependerá de los BPM reales que estén disponibles.

Sin embargo, si desea formar una curva específica, primero debe definir los parámetros de la curva.

1

Teniendo en cuenta que las consultas SQL tienen altos costos fijos por consulta, lo haría así:

  1. uso de una sola consulta SQL para obtener una lista de canciones que están clasificadas por longitud (por ejemplo, una lista de todas las canciones entre x-y segundo largo, de hasta a un máximo de z canciones en total).

  2. crea una función que genera una lista de reproducción de esa lista de canciones, seleccionando canciones de la misma siguiendo el patrón descrito por la curva anterior.

Quizás es algo como esto?

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

Mi idea es unirse a una tabla que tiene un solo campo "Time" (que contiene números enteros 1..MAX, se puede construir esta tabla sobre la marcha) con mesa de la canción, donde el SongID apropiado para cada "Tiempo" representa la canción con bps más cercano a f (tiempo). f es la función que representa la curva. Luego puede ordenar el resultado por tiempo y obtener la curva.

Este método no trata con duplicados, y no sé si es fácil de implementar en SQL (no soy un experto en SQL).

Cuestiones relacionadas