Abfrageergebnis nach Anzahl erfüllter Bedinungen sortieren



  • Das funktioniert leider nicht, der findet keine Spalte "similarity".



  • Was für eine Datenbank nutzt du?

    Hab mal gerade by Mysql nachgesehen:
    Der standard verbietet das wohl. Mir war da auch was im Hinterkopf, hatte das aber unter ORDER und GROUP verbucht.

    Jedenfalls könnte es mit HAVING gehen:

    SELECT ... FROM table ORDER BY similarity GROUP BY id HAVING similarity > 0
    

    u.U. ist die Query aber langsamer / Speicherlastiger als eine in der du alle vergleiche in der WHERE-Clause stehen hast, da HAVING quasi nach ausführen der Query gemacht wird, kurz bevor du das Ergebnis bekommst.

    mfg
    xXx



  • Bei Oracle kann man in der WHERE-Klausel keinen ALIAS verwenden, also must du den similarity-Ausdruck ausschreiben oder du verwendest die eigentliche Abfrage als Subselect:

    SELECT *
    FROM   (
      SELECT 
        id,
        [..] AS similarity 
      FROM table ) t
    WHERE t.similarity > 0
    ORDER BY t.similarity DESC;
    

    Bei 'GROUP BY' wird der Kode möglicherweise recht umständlich, weil du jedes Feld, dass du ausgeben möchtest und das nicht in GROUP BY auftaucht, in eine Funktion (z.B. max()) gießen musst. So sieht das ORACLE zumindest.



  • Bei 'GROUP BY' wird der Kode möglicherweise recht umständlich, weil du jedes Feld, dass du ausgeben möchtest und das nicht in GROUP BY auftaucht, in eine Funktion (z.B. max()) gießen musst. So sieht das ORACLE zumindest.

    Das verstehe ich jetzt nicht so ganz. Sofern id einzigartig ist, passt doch das was ich geschrieben hab. Oder beziehst du dich jetzt auf etwas anderes?

    mfg
    xXx



  • @xXx: Wenn nur die ID interessiert, dann passt die Lösung. Wenn des SELECT allerdings weitere Spalten ausgeben soll, liefert die DB (ORACLE) eine Fehlermeldung, selbst wenn die ID eindeutig ist und somit nur ein Datensatz 'zusammengefaßt' wird. Das gilt auch für den Ausdruck similarity.

    SELECT 
      t.id, 
      t.name
    FROM     table t
    GROUP BY t.id;
    --> Fehler bei t.name
    
    SELECT 
      t.id, 
      max(t.name)
    FROM     table t
    GROUP BY t.id;
    


  • Also ich frage mehrere Felder ab, nicht nur die id.
    Wie ist es denn, wenn ich die text LIKE '%bla%' Ausdrücke einmal nach dem SELECT habe und einmal hinterm WHERE. Macht die DB dann zweimal die gleiche Arbeit, oder wird das LIKE einmal geprüft und sowohl zum Addieren der erfüllten Bedingungen, als auch zum Prüfen hinterm WHERE benutzt?



  • @don_basto Ah, ok. Jetzt verstehe ich das. Von Mysql bin ich das so nicht gewohnt ^^

    @LeGaN Gute Frage, nächste Frage. Welche DB isses denn?

    mfg
    xXx



  • Entschuldigung, ich war die ganze Zeit davon überzeugt, dass ich schon geschrieben hätte,mit welcher DB ich grad arbeite. Naja, nochmal lesen hat mich schlauer gemacht.

    Also ich arbeite mit ner MySQL-DB.



  • Bei Mysql musst du den Einwand von don_basto nicht beachten. Da Mysql sich nicht an der SQL-Standard hält klappt das so wie von mir beschrieben.
    Und was die geschwindigkeit betrifft musst du glaube ich mal testen. Du hast ja zwei Möglichkeiten:
    entweder mit HAVING
    oder alle vergleiche noch einmal ins WHERE

    Hab keine antwort im Netz gefunden, ob Mysql solche Berechnungen zwischenspeichert. Und das geht etwas über meine bisherige Erfahrung hinaus 😉

    mfg
    xXx



  • Also das mit dem GROUP BY funktioniert wunderbar! Jetzt ist es genau so, wie ichs wollte! Vielen Dank!


Anmelden zum Antworten