2012-06-07 15 views
25

Zamierzam mieć ustaloną listę pozycji do zamówienia, przez co nie będę wiedział, dopóki nie uruchomię zapytania, ponieważ istnieje etap randomizacji.Zamówienie mysql według ustalonej listy

chciałbym mieć coś jak następuje:

Zakładamy, że is_launch_set powróci 1,3,7,11 ale zostali losowo przydzieleni do grupy poniżej:

select * from items where is_launch_set=1 order by id values (3,11,7,1); 

jakieś pomysły w jaki sposób osiągnąć to? Myślałem, może być find_in_set, ale nie jestem pewien.

+0

Powiel możliwe: [MySQL Sortuj według jakiejś listy] (http: // stackoverflow .com/questions/6810793 /), choć ta przyciągnęła bardziej dogłębną odpowiedź. –

Odpowiedz

55

Można to zrobić za pomocą albo:

ORDER BY FIND_IN_SET(id, '3,11,7,1') 

lub

ORDER BY FIELD(id, 3, 11, 7, 1) 

lub

ORDER BY CASE id WHEN 3 THEN 0 
       WHEN 11 THEN 1 
       WHEN 7 THEN 2 
       WHEN 1 THEN 3 
         ELSE 4 
     END 
+1

czy jesteś pewien, że znalezisko w zestawie zadziała - zanim spytałem o quesiton, to właśnie myślałem, że odpowiedź będzie, ale kolejność wydaje się inna za każdym razem. Czy są jakieś ustawienia konfiguracji lub cokolwiek innego. Odpowiedź w polu wygląda dobrze. – timpone

+0

@timpone: Jestem pewien, że to działa. Możesz umieścić 'FIND_IN_SET (id, '3,11,7,1')' na 'SELECT', aby upewnić się, że zwraca to, co oczekiwane. – zerkms

+1

Czy masz jakieś informacje na temat tego, które z tych podejść jest najszybsze? Czy jest coś, co można zrobić, aby je przyspieszyć, poza umieszczeniem indeksu na polu "id"? –

Powiązane problemy