Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kilka zapytan do jednej tabeli
yavaho
post
Post #1





Grupa: Zarejestrowani
Postów: 449
Pomógł: 0
Dołączył: 26.05.2004
Skąd: Nowy Sącz

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


Chce wyswietlic 10 losowych artykulow w paru kolejnych zapytaniach. Z tym ze jezeli osiagne limit 10 rekordow w poczatkowych zapytaniach to nastepne nie beda juz wykonywane. Artykuly z pierwszego zapytania musze miec wyswietlone na stronie jako pierwsze, z drugiego jako drugie, itd.
W tej chwili mam to mniej wiecej w ten sposob zrobione:
  1. SELECT *
  2. FROM artykul WHERE ID_marka=1 ORDER BY RAND() LIMIT 10
  3. //jezeli zapytanie zwrocilo mniej niz 10 rekordow TO wykonuje nastepne zapytanie (LIMIT bedzie pomniejszony i ilosc rekordow z pierwszego zapytania)
  4. SELECT *
  5. FROM artykul WHERE ID_model=1 ORDER BY RAND() LIMIT 10
  6. //jezeli dwa poprzednie zapytania zwrocily mniej niz 10 rekordow TO wykonuje nastepne zapytanie (LIMIT bedzie pomniejszony i ilosc rekordow z poprzednich zapytan)
  7. SELECT *
  8. FROM artykul WHERE ID_typ=1 ORDER BY RAND() LIMIT 10
Ale wystepuje jeden problem - druie i trzecie zapytanie zwraca rekordy, ktore byly juz zwrocene we wczesniejszym zapytaniu. Wiec powtarzaja mi sie te samy artykuly.

Moglbym to zrobic w ten sposob:
  1. SELECT *
  2. FROM artykul WHERE((ID_marka=1)OR(ID_model=1)OR(ID_typ=1)) ORDER BY RAND() LIMIT 10
ale wtedy mam pomieszane wszystkie artykuly. A chcialbym te pozycje piorytetowo wyswietlic tak jak w pierwszym przykladzie gdzie sa trzy zapytania. U samej góry te ID_marka=1 potem ID_model=1 i na koncu ID_typ=1

Ten post edytował yavaho 5.12.2005, 21:03:19


--------------------
Książki informatyczneKsiążki biznesowe
Warsztat: notepad hardcore
Go to the top of the page
+Quote Post
D.Q.
post
Post #2





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 5.11.2005

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


Witam,

A może spróbuj w kolejnych zapytaniach dać warunek z pierwszego wykluczający artykuły z wyszukanym tam id.

Czyli np.:
  1. <?php
  2.  
  3. // Powiedzmy, że poniższa tablica zawiera id artykułów wylosowane w pierwszym zapy
    taniu.
  4. $arr = (1,45,21,34,12);
  5.  
  6. //Zapytanie drugie:
  7. $query = "SELECT * 
  8. FROM artykul
  9. WHERE ID_model=1 AND id_artykulu NOT IN (" . implode(",",$arr) . ") ORDER BY RAND() LIMIT 10";
  10. ?>


Zakładając oczywiście, że używasz php winksmiley.jpg
Go to the top of the page
+Quote Post
SongoQ
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Pomysl @D.Q. jest ok, ale mozesz jeszcze pokombinowac z UNION luz z podzapytaniami


--------------------
Go to the top of the page
+Quote Post
yavaho
post
Post #4





Grupa: Zarejestrowani
Postów: 449
Pomógł: 0
Dołączył: 26.05.2004
Skąd: Nowy Sącz

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


Zrobilem wedlug pomyslu @D.Q. Najprostrzy dla mnie, tylko nie wiem jak to bedzie z wdajnoscia?
Myslalem aby zrobic to tez tak aby kolejne rekordy z tych trzech zapytan dorzucac do tabeli w php (tabela mogla by miec nawet 30 rekordow) potem usunac powtorzenia i wyswietlic 10 pierwszych rekordow. Tylko w dalszym ciagu mam trzy zapytania do bazy co nie jest zbyt wydajne.
Tu na forum podalem tylko prosty przyklad (3 zapytania, 10 rekordow). W rzeczywistosci dla potrzeb strony bede mial o wiele wiecej zapytan w ktorych bede chcial pobrac dosc duzo rekordow. Dlatego zalezy mi na optymalizacji tych zapytan do bazy. Narazie nie udalo mi sie tego zrobic w jednym zapytaniu. Gdyby ktos mial jeszcze jakis pomysl to chetnie skorzystam smile.gif


--------------------
Książki informatyczneKsiążki biznesowe
Warsztat: notepad hardcore
Go to the top of the page
+Quote Post
SongoQ
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Przeciez mowilem kombinuj z UNION i podzapytaniami.

Moze takie cos Cie interesuje

  1. SELECT *
  2. FROM (( SELECT *
  3. FROM artykul WHERE ID_marka=1 ORDER BY RAND() LIMIT 10
  4. )
  5. UNION
  6. (
  7. SELECT *
  8. FROM artykul WHERE ID_model=1 ORDER BY RAND() LIMIT 10
  9. )
  10. UNION
  11. (
  12. SELECT *
  13. FROM artykul WHERE ID_typ=1 ORDER BY RAND() LIMIT 10
  14. )) t
  15. LIMIT 10


Sprawdzalem na mysqlu i dzialalo smile.gif tylko czy o taki rezultat Ci chodzilo?


--------------------
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 - 05:18