Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Union i Oder by
Forum PHP.pl > Forum > Bazy danych > MySQL
shycat
Witam, mam taki kod:

  1. $zap=mysql_query("
  2.  
  3. (SELECT * FROM `baza_danych` WHERE (`online` > ".$time2.") AND `id` NOT LIKE '".$id."' AND `pay_typ` LIKE '3' AND `pay_do` > '".$time."')
  4.  
  5. UNION
  6.  
  7. (SELECT * FROM `baza_danych` WHERE (`online` > ".$time2.") AND `id` NOT LIKE '".$id."' ORDER BY `ostatnie_logowanie`)
  8.  
  9. LIMIT ".(($s*20)-20).",20"
  10.  
  11. );



No i mam problem z Order by w drugiej czesci, poniewaz one po prostu nie dziala... wyniki sa "pomieszane" tak jakby w ogole tego Order by nie bylo. Jak moge naprawic ten blad?
Crozin
A po co Ci tutaj w ogóle ten UNION skoro to możesz wrzucić w jedno zapytanie? Jeżeli chcesz by najpierw były zwracane rekordy gdzie:
  1. `pay_typ` LIKE '3' AND `pay_do` > '".$time."
To po prostu posortuje je wg tych danych, czyli:
  1. SELECT * FROM baza_danych
  2. WHERE online > :time2 AND id != :id
  3. ORDER BY pay_typ = 3, pay_do > :time, ostatnie_logowanie
  4. LIMIT :offset, 20;


PS. Co to za dziwne pomysły by porównywać przy pomocy LIKE, liczby traktować jako tekst i nie używać prepared statements?
shycat
W sumie to zawsze uzywam LIKE i NOT LIKE... to ma jakis wplyw na szybkosc?

Hm, nie jestem pewien tez czy Twoje zapytanie jest poprawne jezeli chodzi o to co chce uzyskac...


mam wartosci pay_typ i pay_do ... ktos kto wykupie platne konto ma np. pay_typ=3 a pay_do= np time()+1000 - cos w tym rodzaju... no i jezeli czas dzialania konta pay_typ=3 przekroczy aktualny czas staje sie nieaktywne... czyli nie chce zeby wyniki kont pay_typ=3 ktore wygasly byly wyswietlane w "pierwszenstwie" razem z kontami '3' ktore nie wygasly w srosunku do innych kont pay_typ=1 czy 2
Crozin
Tak, może to mieć wpływ na szybkość działania. Nie jestem pewien, ale optymalizator raczej nie da rady zamienić takiego LIKE-a na normalne porównanie, bo obie konstrukcje jednak działają nieco inaczej (tutaj więcej.

Co do poprawności... masz rację. Powinno być:
  1. ... ORDER BY (pay_typ = 3 AND pay_do > :time), ostatnie_logowanie ...
shycat
Okej, dzieki za pomoc z tym zapytaniem, mam jeszcze jednak pytanie, poniewaz w Twoim kodzie uzywasz np. :time2 zamiast $time2 jednak u mnie w zapytaniu to nie dziala... jak mam tego uzywac i czy jest z tego jakas korzysc? Gdzies czytalem, ze dodawanie zmiennych do zapytania przez ".$zmienna." (czyli jak w normalne np. echo"";) jest wydajne.
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.