Abfrageergebnis nach Anzahl erfüllter Bedinungen sortieren
-
Der Vorschlag von -=]xXx[=- funktioniert wunderbar! Genau das habe ich gebraucht! Vielen Dank!
Was praktisch wäre, wäre, wenn man irgendwie dann noch die Ergebnisse mit similarity>0 eingrenzen könnte. Momentan mache ich das halt so, dass ich in der Where-Klausel "text LIKE '%bla%' OR text LIKE '%blubb%'" stehen habe.
-
Ich denke da spricht nichts dagegen...
Select id, (text LIKE '%bla%') + (text LIKE '%blubb%') AS similarity FROM table WHERE similarity > 0 ORDER BY similarity
dann können die anderen Vergleiche in der Where-Clause alle weg.
mfg
xXx
-
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 WHEREHab 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!