Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SELECT ....... IN() sortowanie po mojemu
Forum PHP.pl > Forum > PHP
adamantd
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
kamil_lk
nie wiem czy ak mozna, ale sprobuj dodac order by null do zapytania
Crozin
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);
adamantd
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?
Crozin
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ć.
adamantd
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.