Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kilka zapytan do jednej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
yavaho
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
D.Q.
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
SongoQ
Pomysl @D.Q. jest ok, ale mozesz jeszcze pokombinowac z UNION luz z podzapytaniami
yavaho
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
SongoQ
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?
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.