[MySQL] Jak posortować rekordy według własnej listy wartości ?

Bazy danych
[MySQL] Jak posortować rekordy według własnej listy wartości ?

Sortowanie elementów jest czymś standardowym i nikt się specjalnie nie musi zastanawiać jak posortować listę rekordów w bazie. Jednak czasem spotykamy się z przypadkami, gdzie konieczne jest zdefiniowanie przez nas kolejności w jakiej rekordy powinny zostać posortowane.

Za przykład posłuży mi prosta tablica z listą obiektów:

+----+------------+
| id | nazwa      |
+----+------------+
| 4  | Obiekt 1   |
+----+------------+
| 6  | Obiekt 2   |
+----+------------+
| 7  | Obiekt 3   |
+----+------------+
| 10 | Obiekt 4   |
+----+------------+
| 11 | Obiekt 5   |
+----+------------+

Teraz zakładamy że wystawiliśmy jakieś API przez które użytkownik może pobierać dane o obiektach. Jednak żeby nie było tak prosto to użytkownik ma dostać listę obiektów o które pyta w takiej samej kolejności jakiej przysłał identyfikatory np.

Użytkownik wysyła do nas zapytanie z listą identyfikatorów:

7, 4, 11

I spodziewa się listy obiektów w takiej samej kolejności (nie wnikamy czemu tak ma być, takie założenie ma spełniać nasze API).

Rozwiązanie 1

Najprostszym rozwiązaniem jest w klauzuli ORDER BY wymienić po kolei identyfikatory, czyli zapytanie wyglądało by następująco:

SELECT * 
FROM nazwa_tabeli 
WHERE id IN (7, 4, 11) 
ORDER BY id = 7 DESC, id = 4 DESC, id = 11 DESC

Rozwiązanie 2

Innym rozwiązaniem problemu jest użycie funkcji [b]FIELD[/b], która jako pierwszy parametr przyjmuje nazwę kolumny, zaś kolejne parametry to wartości według których ma nastąpić sortowanie.

SELECT * 
FROM nazwa_tabeli 
WHERE id IN (7, 4, 11) 
ORDER BY FIELD(id, 7, 4, 11)