Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Sortowanie według wzorca ?
Qss
post
Post #1





Grupa: Zarejestrowani
Postów: 141
Pomógł: 7
Dołączył: 22.02.2009

Ostrzeżenie: (0%)
-----


Witam,

Jak w PHP posortować tablice według pewnego "wzorca"

Powiedzmy że do bazy zapisał mi się pewien ciąg ID o pewnej kolejnosci:
1,4,56,2,8

Pobieram to z bazy w taki sposób:

... WHERE id IN(1,4,56,2,8)

na moje nieszczęście wyniki śa pobierane i sortowane według id a chce osiągnąć wynik sortowania taki jak w ciągu

array(
[0] => array(
id => 1,

)
)
Go to the top of the page
+Quote Post
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Witaj,

To nie takie łatwe... jeśli tych id masz mało to jeszcze można się pokwapić o coś takiego:

  1. ... WHERE id IN(1,4,56,2,8) ORDER BY
  2. CASE id
  3. WHEN 1 THEN 0
  4. WHEN 4 THEN 1
  5. WHEN 56 THEN 2
  6. WHEN 2 THEN 3
  7. WHEN 8 THEN 4
  8. else 5
  9. END
  10. ASC


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
sowiq
post
Post #3





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Albo inny sposób, ale prawdopodobnie wolniejszy niż rozwiązanie powyżej:

  1. WHERE id IN(1, 4, 56, 2, 8)
  2. ORDER BY id = 1 DESC,
  3. id = 4 DESC,
  4. id = 56 DESC,
  5. id = 2 DESC,
  6. id = 8 DESC


Ten post edytował sowiq 30.01.2013, 12:56:48
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Prawdopodobnie najzwięźlejszym, najczytelniejszym i najłatwiejszym w utrzymaniu będzie:
  1. ... ORDER BY FIELD(id, 1, 4, 56, 2, 8);
Przy (raptem) dziesiątkach czy setkach wyników do posortowania różnice w wydajności pomiędzy różnymi rozwiązaniami będą pomijalne.
Go to the top of the page
+Quote Post
Sephirus
post
Post #5





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@Crozin - fajne to to smile.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Qss
post
Post #6





Grupa: Zarejestrowani
Postów: 141
Pomógł: 7
Dołączył: 22.02.2009

Ostrzeżenie: (0%)
-----


@Crozin
Dzięki wielkie i przy okazji znalazłem coś podobnego

  1. ORDER BY FIND_IN_SET(id, '1, 4, 56, 2, 8')


Innym oczywiście tez dziękuje ale to rozwiązanie było najkrótsze i nie wymaga generowania nowych ciągów z CASE
Go to the top of the page
+Quote Post
sowiq
post
Post #7





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Qss @ 30.01.2013, 15:37:55 ) *
Innym oczywiście tez dziękuje ale to rozwiązanie było najkrótsze i nie wymaga generowania nowych ciągów z CASE


Musisz tylko pamiętać, że zarówno FIELD jak i FIND_IN_SET zwrócą 0 dla nieistniejących wartości. Tak więc jeśli w swoim zapytaniu dodasz jakiś warunek OR i w wyniku dostaniesz też ID spoza zakresu uwzględnionego w tych metodach, to takie rekordy zostaną posortowane na początek.

Wyjście jest banalne. Zamiast robić:
  1. -- zamiast robić tak:
  2. ORDER BY FIND_IN_SET(id, '1, 4, 56, 2, 8')
  3.  
  4. -- wystarczy zrobić tak (odwrócona kolejność wartości + odwrócone sortowanie)
  5. ORDER BY FIND_IN_SET(id, '8, 2, 56, 4, 1') DESC


Ale to taka mała uwaga na przyszłość wink.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 20:18