2 Stimmen

Laden einer gesamten verknüpften Liste in einer einzigen Ruby/MySQL-Abfrage

Ich speichere verknüpfte Listen von Daten in Datensätzen, die wie folgt aussehen:

CREATE TABLE IF NOT EXISTS `data_nodes` (
  `record_id` int(11) NOT NULL,
  `prev_node` int(11) NOT NULL,
  `data` varchar(200) NOT NULL,
  PRIMARY KEY  (`record_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

wobei prev_node die record_id des vorherigen Eintrags in der Liste ist, oder 0, wenn wir uns am ersten Eintrag in der Liste befinden.

Eine typische Liste könnte etwa so aussehen:

record_id     prev_node     data
---------     ---------     ----
1             0             first item
12            1             second item
27            12            third item

Ich verwende Rubys mysql-Modul, und was ich tun möchte, ist: die Datensatznummer des letzten Elements in einer Liste gegeben, laden Sie die gesamte Liste in einer einzigen Abfrage. (z. B. gegeben die Datensatz-ID 27, geben Sie eine Ergebnismenge, die "erste Element", "zweite Element", "dritte Element" enthält)

Ist das machbar?

Gracias.

1voto

St.Woland Punkte 5297

Dies ist für Bäume beliebiger Höhe N möglich, aber diese Operation ist nicht mehr möglich, wenn die Baumhöhe N+1 wird.

Mit anderen Worten, wenn Sie wissen, wie viele Ebenen von übergeordneten/untergeordneten Knoten es gibt, können Sie eine Abfrage wie hier beschrieben erstellen (suchen Sie nach Retrieving a Single Path ): http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Sie können das verschachtelte Mengenmodell und das RoR-Plugin verwenden acts_as_nested_set um die gewünschten Ergebnisse zu erzielen.

Wenn Sie Hilfe zu dem Artikel benötigen, lassen Sie es mich wissen.

0voto

Thom Smith Punkte 13529

Es sieht so aus, als würde dies eine Rekursion erfordern. Ich weiß nicht, ob MySQL bereits Rekursion in SQL implementiert, und wenn ja, wäre es wahrscheinlich nicht sehr performant. Ich bin nicht sicher, ob die Speicherung der Daten auf diese Weise die beste Lösung ist.

0voto

sibidiba Punkte 6172

Sie benötigen eine rekursive SQL-Abfrage, z. B. START WITH ... CONNECT BY in Oracle. Leider unterstützt MySQL ein solches Konstrukt in einer einzelnen Abfrage nicht. Gespeicherte Funktionen können auch keine Rekursion durchführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X