Michi: sortierung über zwei Tabellen, und dann eine bestimmte Zeile nach der sortierung ausgeben

ich stehe vor einem Problem. Ich habe in einer Tabelle eine Liste mit Fragen und zu jeder Frage sind dort auch vorgefertigte Antworten zu finden.

Wenn ich mir nur alle Frage ausgeben möchte mache ich das über folgende SELECT Anweisung

SELECT a.*,b.categorie FROM quest a 
LEFT JOIN quest_cat b ON a.cat = b.id
WHERE a.master=0
ORDER BY b.sort ASC, a.sort ASC

Wie kann ich aber die Fragen einzeln ansteuern, also das ich die zweite, oder die vierte Frage ausgeben möchte.

Ich habe zwar eine fortlaufende ID, doch diese stimmt ja nach der sortierung nicht mehr, es muss laso möglich sein die zweite, oder die vierte Frage nach der sortierung direkt anszusprechen

  1. Tach!

    Wie kann ich aber die Fragen einzeln ansteuern, also das ich die zweite, oder die vierte Frage ausgeben möchte.

    Mit LIMIT vielleicht?

    Ich habe zwar eine fortlaufende ID, doch diese stimmt ja nach der sortierung nicht mehr,

    ID sind auch nur zum Identifizieren vorgesehen und für alle anderen Aufgaben meistens nicht geeignet.

    dedlfix.

  2. Hallo Michi,

    du verwendest quest LEFT JOIN quest_cat. Warum? Das wäre nur sinnvoll, wenn es Fragen ohne Kategorien gibt. Ist das so?

    Das Problem mit dem Satz Nr. X ist, dass solche Angaben in SQL eigentlich irrelevant sind. Eine laufende Nummer ist Schall und Rauch, wenn die DB im Multiuser-Betrieb läuft. Die Hauptanwendung für "Zeile X" oder "Zeile X-Y" ist eigentlich Paging, und das macht man schlauerweise über Schlüssel, nicht laufende Nummern (weil es für SQL effizienter ist).

    Die Frage wäre also: Woher kommt überhaupt die laufende Nummer? Woher weißt Du, dass Du die "zweite Zeile" brauchst? Abhängig davon kann man überlegen, wie man das Problem mit SQL Prinzipien lösen kann.

    Also - wenn Du es natürlich unbedingt willst - es gibt in MYSQL die LIMIT Klausel, und in MS SQL die TOP Klausel. Oracle oder Postgre haben sicherlich ähnliches.

    MYSQL: LIMIT X, Y (am Ende des Statements) bedeutet, dass er vom Ergebnis X Sätze überspringen soll und dann Y Sätze zurückgeben.

    MS SQL: TOP N (direkt hinter dem SELECT Schlüsselwort) bedeutet, dass er vom Ergebnis die ersten N Sätze liefern soll.

    Rolf

    --
    sumpsi - posui - clusi
    1. Danke, ich habe esmit mit Limit 3,1 gelösst

    2. Hallo

      MS SQL: TOP N (direkt hinter dem SELECT Schlüsselwort) bedeutet, dass er vom Ergebnis die ersten N Sätze liefern soll.

      Das Problem bei der MS-SQL-TOP-Syntax ist, dass man nur an die X ersten Datensätze (vom Anfang der Ergebnismenge bis zu X) kommt. Ohne weitere Handstände ist keine Beschränkung auf beispielsweise die Datensätze 101 bis 120 möglich. In neueren MS-SQL-Versionen gibt es eine neue Syntax, die mit der LIMIT X, Y von MySQL und PostgreSQL vergleichbar ist.

      SELECT
        a,
        b
      FROM table
      WHERE c > 10  -- irgendeine ausgedachte WHERE-Klausel
      OFFSET @X ROWS FETCH NEXT @Y ROWS ONLY
      

      Die Syntax funktioniert ab MS-SQL-Server-Version 2012.

      Tschö, Auge

      --
      Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
      Hohle Köpfe von Terry Pratchett
      1. Hallo Auge,

        danke, wieder was gelernt :)

        Ich arbeite zwar seit Jahrzehnten mit MS SQL, aber man bekommt nicht immer alle Updates der Syntax mit.

        Rolf

        --
        sumpsi - posui - clusi
        1. Hallo

          danke, wieder was gelernt :)

          Ich arbeite zwar seit Jahrzehnten mit MS SQL, aber man bekommt nicht immer alle Updates der Syntax mit.

          Bis vor kurzem habe ich das auch nicht gekannt. Dann brauchte ich LIMIT und durfte feststellen, dass die MS-SQL-Entsprechung von LIMIT bei dem damals noch laufenden SQL-Server 2008 eine umständliche Kontruktion mit einer Vorauswahl der Datensätze erfordert. Das hat mich erst einmal zurückschrecken lassen, bis mir klar wurde, dass es die neue Syntax gibt und [1] der Umzug auf eine aktuelle SQL-Server-Version unmittelbar bevorstand.

          Manchmal passt halt alles zusammen. 😀

          Tschö, Auge

          --
          Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
          Hohle Köpfe von Terry Pratchett

          1. boolesches UND ↩︎