Announcement

Collapse
No announcement yet.

Wie kann ich die gleiche Zeile mehrfach im Resultat ausgeben?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann ich die gleiche Zeile mehrfach im Resultat ausgeben?

    Guten Tag, ich stehe seit Stunden auf dem Schlauch:

    In der Tabelle `Sequenzen` gibt es eine Spalte, die eine Sequenz als string in der Form enthält:
    Code:
    ID   name      steps
    _____________________________
    007  tierlaute  42;43;44;42;42;44;46;46
    Wie kann ich denn bitte aus einer anderen Tabelle die Zeilen in dieser Reihenfolge und ungekürzt bekommen, also
    Code:
    ID  values...
    ___________
    42  muh
    43  mäh
    44  wau
    42  muh
    42  muh
    44  mäh
    46  miau
    46  miau
    Ich jonglier schon ne ganze Weile rum, komm aber auf keine elegante Lösung.
    es handelt sich um eine mit php und anderen Sprachen behandelten Datenbank.
    Vielen Dank, ich komm sonst nicht weiter.

    Zuerst war ich drauf und dran, eine temporäre Tabelle zu erstellen im Format:
    Code:
    counter  ID
    ____________
    1        42
    2        43
    3        44
    4        42
    5        42
    6        44
    7        46
    8         46
    und die dann zusammen mit der zweiteren SELECTEN. Aber dafür die Semikola auseinanderpfriemeln in mySQL und in eine Schleife liefern gelang mir nicht.

    Ich habe mir jetzt in php eine foreach-Schleife zur Hilfe genommen. Aber ich werde den Verdacht nicht los, dass es unnötig ist, für jede Zeile eine "SELECT $riesenquerystring.$index;" abzufeuern. Deswegen: Frage bleibt offen.
    Zuletzt editiert von blausand; 16.07.2010, 11:02. Reason: Workarounds gefunden.

  • #2
    Was stellt denn tierlaute für nen Datentyp dar? Varchar? Char? Ist die Übung explizit so gewollt?

    Du solltest dir mal über dein ER-Modell Gedanken machen und die Datenbank normalisieren. Jeder Laut sollte dann einzeln mit einem Namen versehen sein. Dazu wird die Tabelle in 2 aufgeteilt, da du ja wahrscheinlich die ID zu einem Namen speicherst.

    Würde so aussehen:
    (Tabelle: sequenzen)
    id name

    (Tabelle: sequenzdetails)
    sequenzen.id (fremdschlüssel) tierlaut sequenznr

    sequenzen.id ist hierbei als Fremdschlüssel auf die Tabelle Sequenzen anzusehen.

    Sequenznummer wird verwendet um die Stelle anzugeben an der die Sequenz vorkommt.. Es gibt auch ne Menge anderer Möglichkeiten. Aber SQL ist eigentlich nicht für prozeduale Ausführung gedacht.

    Ich habe mir jetzt in php eine foreach-Schleife zur Hilfe genommen. Aber ich werde den Verdacht nicht los, dass es unnötig ist, für jede Zeile eine "SELECT $riesenquerystring.$index;" abzufeuern. Deswegen: Frage bleibt offen.
    Wenn dus so löst, könntest dir auch erst die Sequenz in einer Query holen, und anschließend über EINE zweite Query, welche du dynamisch erstellst, mit Hilfe von JOIN die benötigten values (muh, wau, etc)

    Comment


    • #3
      Wieso muß das alles in einer Query erfolgen? In jeder vernünftigen Programmiersprache bekommt man das mit 2 Queries (1 Abfrage von sequenzen und anschließend abfrage von zweite Tabelle). Zusammenbau der Ergebnismenge dann in der Programmiersprache. In 5 Minuten locker erledigt ohne das man sich jetzt eine hochkomplexe Query aus den Rippen schneiden müsste.

      Comment


      • #4
        Also doch eine temporäre Tabelle im Arbeitsspeicher?

        Danke für Ihre Reaktionen!
        Zur Präzision: Die Tabelle wird tausende Schritte enthalten, die von zig Benutzern erstellt und zu hunderten Sequenzen beliebiger Länge zusammengebaut werden.
        Diese Schritte halten also die eigentlichen Daten in vielen Spalten.
        ! Allerdings können diese Sequenzen wiederum zu Präsentatinonen zusammengesetzt werden. Es gibt also schon ausreichend Indirektheit!

        Strenges Normalisieren hätte zur Folge:
        + keine Sequenzen mehr in einer einzigen Spalte (42;43;44 etc.) -> stattdessen Dereferenzieren einer ID aus einer weiteren Tabelle.
        - Diese wäre unübersichtlich: sie müßte alle Sequenzen untereinander beherbergen. Eine zusätzliche Spalte könnte - bei hoher Redundanz - die SequenzID beinhalten.
        + Dann wären einzelne Sequenzen super abzufragen.
        - Noch redundanter würde diese Tabelle, wenn sie die Reihenfolge der Schritte als zusätzliche ID explizit enthielte.

        Was spricht denn nun dagegen, eine temporäre Tabelle aus der Sequenz zu erstellen, und diese in einer Query zusammen mit der Eigentlichen zum sortieren zu benutzen?
        Und wie erstellt man eine Tabelle wie die dritte oben aus dem String aus der ersten?

        Comment


        • #5
          Originally posted by blausand View Post
          ...
          Strenges Normalisieren hätte zur Folge:
          + keine Sequenzen mehr in einer einzigen Spalte (42;43;44 etc.) -> stattdessen Dereferenzieren einer ID aus einer weiteren Tabelle.
          - Diese wäre unübersichtlich: sie müßte alle Sequenzen untereinander beherbergen. Eine zusätzliche Spalte könnte - bei hoher Redundanz - die SequenzID beinhalten.
          + Dann wären einzelne Sequenzen super abzufragen.
          - Noch redundanter würde diese Tabelle, wenn sie die Reihenfolge der Schritte als zusätzliche ID explizit enthielte....
          In einer Datenbank muss nichts übersichtlich sein. Dafür gibt es ein ER-Diagramm und dann wären alle Datenbanken die eine n:m Beziehung enthalten unübersichtlich -> Glaub ich nicht. Wichtig ist hier die Integrität der Daten durch die man Abfragbarkeit der Daten erreicht.
          Die Reihenfolge MUSS in der Datenkbank als zusätzliche Spalte Position gehandhabt werden. Ich hab das in meinen Programmen auch schon sehr oft genau so gemacht.

          Code:
          Tabelle Sequenz
          ID Sound
          ==========
          1  Muh
          2  Mäh
          3  Fiep
          
          Tabelle Song
          ID Songname
          ==========
          1  Muh Mäh
          2  Fiep Fiep Fiep
          
          Tabelle SongSequenzen
          ID SongId SequenzId Position
          =====================
          1  1      1         1
          2  1      2         2
          3  2      3         1
          4  2      3         2
          5  2      3         3
          Solltest Du noch Einfluss drauf haben würde ich es so machen.

          Comment

          Working...
          X