Hallo,
Ich habe mich etwas in sql eingearbeitet und habe dann gedacht, dass folgender Befehl funktionieren sollte:
SELECT Titel,Untertitel,Id FROM media ORDER BY ( (Titel LIKE '%Suchbegriff1%') + (Titel LIKE '%Suchbegriff2%') ),Titel,Untertitel,Id
Warum klappt das mit dem "+"-Operator nicht?
was verstehst Du unter "klappt nicht"?
Folgender Befehl funktioniert (für mich verwirrenderweise)
SELECT Titel,Untertitel,Id FROM media ORDER BY (Titel LIKE '%Suchbegriff1%'),Titel,Untertitel,Id
was verstehst Du unter "funktioniert"
Hat es etwas mit dem Ablauf der Ausführung des Befehls zu tun?
Gibt es eine Variante, wie man Befehl 1 zum funktionieren bringen kann? Alternative?
besonders performant dürfte die Abfrage nicht sein, allein schon wegen des zweifachen
%suchbegriff%,
wobei Dir kein Index helfen kann.
Ich kann Dein Problem jedoch nicht nachvollziehen. Ich erhalte die Ergebnisse, von denen ich erwarte, dass Du sie erwartest.
Beispiel:
Ausgangstabelle:
mysql> SELECT plz FROM tabelle
;
+-------+
| plz |
+-------+
| 12345 |
| 09876 |
| 12222 |
| 44444 |
| 44000 |
+-------+
5 rows in set (0.01 sec)
Nun mit ein paar berechneten Spalten:
a) mit 4: enthält die Spalte plz (mindestens) eine 4
b) mit 0: enthält die Spalte plz (mindestens) eine 0
c) mit 4oder0: Wertung: für jeden mindestens einmal gefundenen Suchtext gibt es einen Wertungspunkt.
SELECT
plz,
(plz LIKE '%4%') mit4,
(plz LIKE '%0%') mit0,
((plz LIKE '%4%') + (plz LIKE '%0%')) mit4oder0
FROM
tabelle
| plz | mit4 | mit0 | mit4oder0 |
+-------+------+------+-----------+
| 12345 | 1 | 0 | 1 |
| 09876 | 0 | 1 | 1 |
| 12222 | 0 | 0 | 0 |
| 44444 | 1 | 0 | 1 |
| 44000 | 1 | 1 | 2 |
Und jetzt nach der Wertungsspalte sortiert.
SELECT
plz,
(plz LIKE '%4%') mit4,
(plz LIKE '%0%') mit0,
((plz LIKE '%4%') + (plz LIKE '%0%')) mit4oder0
FROM
tabelle
ORDER BY
((plz LIKE '%4%') + (plz LIKE '%0%'));
| plz | mit4 | mit0 | mit4oder0 |
+-------+------+------+-----------+
| 12222 | 0 | 0 | 0 |
| 12345 | 1 | 0 | 1 |
| 09876 | 0 | 1 | 1 |
| 44444 | 1 | 0 | 1 |
| 44000 | 1 | 1 | 2 |
5 rows in set (0.00 sec)
Und ja:
mysql> SELECT TRUE + FALSE;
+--------------+
| TRUE + FALSE |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
mysql> SELECT TRUE + TRUE + TRUE;
+--------------------+
| TRUE + TRUE + TRUE |
+--------------------+
| 3 |
+--------------------+
1 row in set (0.00 sec)
mysql> SELECT TRUE + TRUE;
+-------------+
| TRUE + TRUE |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
MySQL nutzt TINYINT für BOOLEAN.
Freundliche Grüße
Vinzenz