Du bist auf dem richtigen Weg. Fügen Sie einfach ein order by
hinzu :
SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%' OR ord = 0
ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
LIMIT 1;
Oder alternativ:
ORDER BY ord DESC
Beide setzen ord = 0
letzte Zeile.
BEARBEITEN:
Erwin spricht einen guten Punkt an, der aus Sicht der Indexnutzung ein OR
ist im WHERE
Klausel ist nicht der beste Ansatz. Ich würde meine Antwort wie folgt ändern:
SELECT *
FROM ((SELECT street, zip, city
FROM address
WHERE street LIKE 'Test%'
LIMIT 1
)
UNION ALL
(SELECT street, zip, city
FROM address
WHERE ord = 0
LIMIT 1
)
) t
ORDER BY (CASE WHEN street LIKE 'Test%' THEN 1 ELSE 0 END) DESC
LIMIT 1;
Dadurch kann die Abfrage zwei Indizes verwenden (street
und ord
). Beachten Sie, dass dies wirklich nur am LIKE
liegt Muster beginnt nicht mit einem Platzhalter. Wenn der LIKE
Muster mit einem Platzhalter beginnt, würde diese Form der Abfrage dennoch einen vollständigen Tabellenscan durchführen.