Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Union i Oder by
shycat
post
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 25.02.2008

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Crozin
post
Post #2





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

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


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?
Go to the top of the page
+Quote Post
shycat
post
Post #3





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 25.02.2008

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


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
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%)
-----


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 ...
Go to the top of the page
+Quote Post
shycat
post
Post #5





Grupa: Zarejestrowani
Postów: 83
Pomógł: 1
Dołączył: 25.02.2008

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


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #6





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

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


http://pl.php.net/manual/en/pdo.prepared-statements.php
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.12.2025 - 00:09