2016-11-26 21 views
1

Ich habe eine Tabelle wie dieseMehrere Variablenzuweisungen mit einzelnen Spalt als Ergebnis

+----+------+ 
| ID | Name | 
+----+------+ 
| 0 | Foo | 
| 1 | Bar | 
+----+------+ 

Basierend auf den Tabellenzeilen ich in jeder Zeile ein Ranking berechnen will, so dass eine Abfrage wie

SELECT *, [calculation] AS ranking 
FROM table 
ORDER BY ranking DESC 

wäre so etwas wie

+----+------+---------+ 
| ID | Name | Ranking | 
+----+------+---------+ 
| 0 | Bar |  3 | 
| 1 | Foo |  1 | 
+----+------+---------+ 

Mein Problem ist, zurückkehren, dass ich mehrere Zuweisungen pro Zeile ausführen müssen, w ohne weitere Spalten zu bekommen; im Grunde so etwas wie

@ranking:= 0 
IF(Name LIKE $firstTerm, @ranking := @ranking + 1, @ranking := @ranking) 
IF(Name LIKE $secondTerm, @ranking := @ranking + 1, @ranking := @ranking) 
IF(Name LIKE $thirdTerm, @ranking := @ranking + 1, @ranking := @ranking) 

Für jede Reihe, so dass am Ende habe ich entweder 0, 1, 2 oder 3 als eine zusätzliche Spalte für jeden Eintrag in meiner Tabelle

EDIT: Theoretisch eine dynamisch generierte Abfrage wie

würde funktionieren wie erwartet, aber Sie können sich wahrscheinlich vorstellen, wohin dies führt, wenn wir mehr als 3 Bedingungen haben!

+0

Erzählen Sie uns mehr über diese Berechnung – Strawberry

+0

es angenommen hat mehr LIKE Vergleiche sein, so dass die mehr Spiele haben, ist, je höher es – RoiEX

+0

Platz @Strawberry ich meine Frage mehr korrekt sein bearbeiten – RoiEX

Antwort

2
SELECT *, 
    IF(Name like $firstTerm, 1, 0) + 
    IF(Name like $secondTerm, 1, 0) as Ranking 
    FROM table ORDER BY Ranking DESC; 

Wenn jedoch die Datenmenge wird groß, und die Berechnung komplex, mit einer Suchmaschine (Elasticsearch, solr) effizienter und flexibler wäre.

+0

Das ist genau das, was ich brauchte! Vielen Dank! Hätte darüber nachdenken sollen! – RoiEX

Verwandte Themen