Jesteś na dobrej drodze. Po prostu dodaj order by
:
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;
Lub alternatywnie:
ORDER BY ord DESC
Każdy z nich umieści ord = 0
ostatni wiersz.
EDYCJA:
Erwin zwraca uwagę, że z perspektywy wykorzystania indeksu OR
w WHERE
klauzula nie jest najlepszym podejściem. Zmodyfikowałbym moją odpowiedź tak, aby była:
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;
Pozwala to na użycie dwóch indeksów (street
i ord
). Zauważ, że dzieje się tak naprawdę tylko dlatego, że LIKE
wzór nie zaczyna się od symbolu wieloznacznego. Jeśli LIKE
wzorzec zaczyna się od symbolu wieloznacznego, wtedy ta forma zapytania nadal wykonałaby pełne skanowanie tabeli.