2017-11-09 1 views
0

I ein PROCEDURE in MySQL erstellen will, die x Zeilen aus einer Tabelle immer wieder, auch wenn die Tabelle weniger als x Einträge hat.wählt immer x Zeilen aus der Tabelle und von vorn beginnen, wenn am Ende

Wie so:

+----+-------+ 
| id | value | CALL myProcedure USING(4); 
+----+-------+ returns → a b c a 
| 1 | a |  
| 2 | b |  
| 3 | c | 
+----+-------+ 

intern speichern ich die letzte zurück Reihe (in diesem Fall wäre es 'a' sein) und auf den nächsten Anruf sollte das Verfahren von dort aus weiter:

1st: CALL myProcedure USING(4) → a b c a 
2nd: CALL myProcedure USING(3) → b c a 
3rd: CALL myProcedure USING(7) → b c a b c a b 
4th: CALL myProcedure USING(2) →  c a  

I versuchte es mit UNION - so würde der 3. Aufruf mit x = 7 aussehen:

(
SELECT `value` 
    FROM `table` 
    LIMIT 1,7 
) 
UNION 
(
SELECT `value` 
    FROM `table` 
    LIMIT 4 
) 

"gib mir so viel wie möglich (bis zu 7) Reihen und beginnen nach Zeile 1.
Dann über Start und geben Sie mir den Rest. (7 - Anzahl der vorangegangenen Zeilen = 4)"

Die erste Auswahl gibt b c zurück und die zweite Auswahl gibt a b c zurück. Beide Selektionen zusammen geben b c a zurück.

Jetzt bin ich diese Probleme des:

1)UNION nicht die gleiche Zeile zurückgeben zweimal (alles, was ich von oben Anruf bekommen würde wäre b c a)

2) Bei Am besten kann ich "zweimal über meine Tabelle" gehen, weil es nur eine Vereinigung gibt und ich keine Möglichkeit habe, dynamisch weitere Verbindungen hinzuzufügen. Also selbst wenn ich doppelte Zeilen bekommen könnte, würde es nur b c a b c ergeben und die restlichen a b ich erwarte, wird fehlen.

Wie kann ich mehrere Male über meine Tabelle "loopen"? Gibt es etwas besseres als UNION könnte ich verwenden?

EDIT (nach meinem Problem zu lösen) folgte ich cf_en's proposition einer Schleife durch das Ergebnis außerhalb der Datenbank gesetzt, wenn die zurückgegebene Anzahl der Zeilen ist geringer als erwartet. Alle anderen Fälle (diejenigen, die nur eine Iteration benötigen) werden von der Prozedur abgedeckt (unter Verwendung einer einfachen UNION).

+0

Sie können 'UNION ALL' verwenden, um zu verhindern, dass die Union Duplikate entfernt. Ich frage mich jedoch, ob die Datenbank der beste Ort ist, um herumzulaufen. Könnten Sie diese Logik stattdessen im aufrufenden Code implementieren? –

+0

:) genial, wusste nicht über 'UNION ALL'. Jetzt "schleift" es mindestens zweimal. Nun, ich dachte daran, Ergänzungen zu machen, wenn der aufrufende Code erkennt, dass nicht alle erwarteten Ergebnisse zurückgegeben wurden. Allerdings möchte ich die Anzahl der Rundreisen in die Datenbank reduzieren und die Logik an einem Ort haben. – GameDroids

+0

Ich meinte, Sie können nur die eindeutigen Datenzeilen aus der Datenbank abrufen und stattdessen die gesamte Schleifenlogik im aufrufenden Code verarbeiten. –

Antwort

0

Sie können verwenden, um zu verhindern, dass die Verbindung Duplikate entfernt. Ich frage mich jedoch, ob die Datenbank der beste Ort ist, um herumzulaufen. Könnten Sie die einzelnen Zeilen aus der Datenbank zurückgeben und stattdessen die Schleifenlogik im aufrufenden Code implementieren?

Verwandte Themen