2010-02-27 7 views
5

Ich habe eine Tabelle von Songs und ihre Beats pro Minute Werte, und ich möchte Wiedergabelisten erstellen, die eine Kurve wie folgt folgen:Bestelldatenbankabfrage führt entlang einer Kurve

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

Ich weiß, dies ist wahrscheinlich nicht möglich in einer einzigen SQL-Anweisung, aber ich bin daran interessiert, Lösungen zu hören - im Augenblick ist der beste Ansatz, den ich sehe, die Auswahl mehr Spuren als notwendig und die Bestellung in meinem Anwendungscode (Python).

+0

Sehr interessante Idee. Keine Ahnung von der Lösung. –

Antwort

3

Eine einfache Möglichkeit, dies zu tun, wäre, die Songs einfach nach BPM im SQL zu sortieren. Sobald Sie die Daten in Ihrer Anwendung haben, erstellen Sie Ihre Liste von vorne und von hinten, indem Sie die Elemente mit einem ungeraden Index am Anfang und einem Index am Ende platzieren. Dies würde dazu führen, dass der BPM im Laufe der Zeit ansteigt und abfällt. Die Form davon hängt von den tatsächlichen BPMs ab, die verfügbar sind.

Wenn Sie jedoch eine bestimmte Kurve erstellen möchten, müssen Sie zuerst die Parameter der Kurve definieren.

1

in Anbetracht, dass SQL-Abfragen haben hohe Fixkosten pro Abfrage, würde ich es tun, wie folgt:

  1. Verwendung einer SQL-Abfrage eine Liste von Songs zu erhalten, die nach Länge geordnet (beispielsweise eine Liste aller Lieder zwischen x - y Sekunden Länge, bis zu einem Maximum von z Songs insgesamt).

  2. Erstellen Sie eine Funktion, die aus dieser Liste von Titeln eine Wiedergabeliste generiert, indem Sie die Titel auf eine Weise auswählen, die dem oben in der obigen Kurve beschriebenen Muster entspricht.

Vielleicht so etwas?

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

Meine Idee ist es, einen Tisch zu setzen, die ein einzelnes Feld „Time“ hat (enthält ganze Zahlen 1..MAX, können Sie diese Tabelle im Fluge bauen) mit dem Tisch des Liedes, wo die entsprechenden songID für Jedes "Time" repräsentiert das Lied mit bps am nächsten zu f (Zeit). f ist die Funktion, die die Kurve darstellt. Dann können Sie das Ergebnis nach Zeit ordnen und die Kurve erhalten.

Diese Methode befasst sich nicht mit Duplikaten, und ich weiß nicht, ob es in SQL einfach zu implementieren ist (ich bin kein SQL-Experte).

Verwandte Themen