Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> SELECT ....... IN() sortowanie po mojemu, Jak posortować wyniki po mojemu a nie rosnąco?
adamantd
post 18.02.2013, 01:05:13
Post #1





Grupa: Zarejestrowani
Postów: 228
Pomógł: 7
Dołączył: 15.08.2012
Skąd: Rzeszów

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


Witam! Nie mogę znaleźć nigdzie.. Proste zapytanie do bazy np:

  1. SELECT * FROM tabela WHERE id IN(67, 54, 95, 23, 56, 15, 2)


wyświetli rekordy w kolejności : 2, 15, 23, 54, 56, 67, 95

a ja chcę dokładnie tak jak wrzuciłem do IN(xxx).
testowałem i do nawiasu na pewno są wrzucane id w takiej kolejności jak ja chcę a wyświetla się w kolejności rosnącej

jak sprawić żeby było po mojemu?

z góry dzięki
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
kamil_lk
post 18.02.2013, 01:31:14
Post #2





Grupa: Zarejestrowani
Postów: 325
Pomógł: 33
Dołączył: 31.05.2008

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


nie wiem czy ak mozna, ale sprobuj dodac order by null do zapytania

Ten post edytował kamil_lk 18.02.2013, 01:32:28
Go to the top of the page
+Quote Post
Crozin
post 18.02.2013, 01:31:18
Post #3





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

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


Nie określiłeś nigdzie kolejności w jakiej mają być zwrócone rekordy (klauzula ORDER BY), więc kolejność zwracanych rekordów jest nieokreślona. Jeżeli korzystasz z MySQL-a, możesz wykorzystać funkcję FIELD() do określenia kolejności:
  1. ...ORDER BY FIELD(id, 67, 54, 95, 23, 56, 15, 2);
Go to the top of the page
+Quote Post
adamantd
post 18.02.2013, 17:15:37
Post #4





Grupa: Zarejestrowani
Postów: 228
Pomógł: 7
Dołączył: 15.08.2012
Skąd: Rzeszów

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


Crozin pomogło po Twojemu ale teraz zapytanie wygląda tak:

  1.  
  2.  
  3. $id = '67, 54, 95, 23, 56, 15, 2';
  4.  
  5. SELECT * FROM tabela WHERE id IN({$id}) ORDER BY FIELD(id, {$id})
  6.  


wtedy wszystko działa i sortowanie jest po mojemu tyle, że jeśli będę miał np do wyświetlenia 200 rekordów to mogę skorzystać z takiego sposobu? Wtedy zapytanie jest bardzo długie, ponieważ muszę 2 razy użyć zmiennej $id

edit:

mam jeszcze jedno pytanie:
przykład:
  1.  
  2. $id = '67, 54, 95, 23';
  3.  
  4. $resInfo = db->query("SELECT id, nick FROM tabela WHERE id IN({$id}) ORDER BY FIELD(id, {$id})");
  5.  
  6. echo '<pre>';
  7. print_r($resInfo);
  8. echo '</pre>';
  9.  
  10.  
  11. (
  12. [0] => Array
  13. (
  14. [id] => 67
  15. [nick] => przyklad1
  16. )
  17.  
  18. [1] => Array
  19. (
  20. [id] => 54
  21. [nick] => przyklad2
  22. )
  23.  
  24. [2] => Array
  25. (
  26. [id] => 95
  27. [nick] => przyklad3
  28. )
  29.  
  30. [3] => Array
  31. (
  32. [id] => 23
  33. [nick] => przyklad4
  34. )
  35.  
  36. )
  37.  
  38.  



Pytanie brzmi -jak wypełnić pustą wartością jeżeli rekord nie zostanie odnaleziony w tabeli ponieważ go tam już nie ma?
Załóżmy, że nie ma w tabeli usera o id 95, wtedy rezultat tego zapytania będzie wyglądał następująco:

  1.  
  2. (
  3. [0] => Array
  4. (
  5. [id] => 67
  6. [nick] => przyklad1
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [id] => 54
  12. [nick] => przyklad2
  13. )
  14.  
  15. [2] => Array
  16. (
  17. [id] => 23
  18. [nick] => przyklad4
  19. )
  20.  
  21.  
  22. )
  23.  


Ja jednak potrzebuję, żeby wyglądało to mniej więcej tak:

  1.  
  2. (
  3. [0] => Array
  4. (
  5. [id] => 67
  6. [nick] => przyklad1
  7. )
  8.  
  9. [1] => Array
  10. (
  11. [id] => 54
  12. [nick] => przyklad2
  13. )
  14.  
  15. [2] => Array
  16. (
  17. [id] => 0
  18. [nick] => 0
  19. )
  20.  
  21. [3] => Array
  22. (
  23. [id] => 23
  24. [nick] => przyklad4
  25. )
  26.  
  27. )
  28.  
  29.  


Czy jest to możliwe?

Nie wiem czy dobrze to opisałem, chciałbym po prostu podczas zapytania gdzie wykorzystuję IN() wyświetlić również rekordy które nie istnieją, czyli w momencie jeżeli nie znalazł rekordu o id jednym z tych w nawiasie IN(xx, xx, xx, xx) to żeby wyświetlił również w tablicy tylko jako pole puste lub '0'.

Czy da się to zrobić za pomocą jakiegoś tajemniczego sposobu już na poziomie zapytania do bazy czy trzeba kombinować z pętlami?

Ten post edytował adamantd 18.02.2013, 17:17:25
Go to the top of the page
+Quote Post
Crozin
post 18.02.2013, 18:53:56
Post #5





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

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


W samym zapytaniu już tego w żaden sposób nie zrobisz. A nawet jeżeli się da, to zapewne jakimiś okropnymi potworkami. Zrobienie tego po stronie PHP nie będzie natomiast stanowić najmniejszego problemu.
Swoją drogą, masz tutaj dobry przykład dlaczego z bazy danych w miarę możliwości niczego się nie kasuje, a jedynie oznacza jako skasowane i filtruje w wynikach normalnych zapytań.

PS. Ilość 200 pozycji w IN()/FIELD() nie powinna stanowić jakiegoś ogromnego problemu - zawsze zresztą możesz samemu to sprawdzić.
Go to the top of the page
+Quote Post
adamantd
post 18.02.2013, 19:18:52
Post #6





Grupa: Zarejestrowani
Postów: 228
Pomógł: 7
Dołączył: 15.08.2012
Skąd: Rzeszów

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


Crozin wielkie dzięki za naprowadzenie mnie na odpowiedni tor, przerobię odpowiednio tabelę z userami i jeżeli user usunie konto to nie usunę rekordu tylko oznaczę go jako usunięty. Nie wpadłem na takie rozwiązanie.
p.s. -po stronie php chciałem uniknąć bo musiałbym zrobić pętlę w której za każdym zapętleniem wysyłane byłoby zapytanie (w rezultacie sporo zapytań zamiast jednego)

problem rozwiązany
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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:52