Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja zapytania
Forum PHP.pl > Forum > Bazy danych
Wasiquard
Mam kawałek kodu php z zapytaniem mysql:

  1. <?
  2. $query = mysql_query(&#092;"SELECT * FROM category ORDER BY position;\");
  3. while($rekord = mysq_fetch_array($query){
  4. $wynik = mysql_query(&#092;"SELECT * FROM wallpaper WHERE category='$rekord[id]';\");
  5. $razem = mysql_num_rows($wynik);
  6. ?>
  7. <li><a href=\"index.php?kategoria=<?= $rekord[id] ?>\" /><?= $rekord[name] ?> [<?= $razem ?>]</li>
  8. <? } ?>


Jak widać są tu umieszczone 2 zapytania, a ilość wysłanych zapytań jest zależna od rekordów wyciągniętych z tabeli zawierającej kategorie tapet. Chciałbym by w jedno zapytanie podawało mi info z tabeli "category" i liczbę tapet z każdej kategori znajdujących się w tabeli "wallpaper". Niemogę tego jakoś robić, przeszperałem wszystkie moje podręczniki i nic, z wydaje mi się że takie zapytanie można wykonać.
crash
  1. SELECT count( DISTINCT w.id ), w.id, w.name
  2. FROM category AS c, wallpaper AS w WHERE w.category = c.id GROUP BY w.id ORDER BY w.name ASC

'Powinno' być dobrze...
Jabol
  1. SELECT count(w.*) AS ilosc, c.id AS id, c.name AS name
  2. FROM category AS c LEFT JOIN wallpaper AS w ON (c.id=w.category) GROUP BY c.id ORDER BY c.position;
Wasiquard
Próbowałem podobnie wcześniej i jest dalej błąd. Najdziwniejsze, że błąd występuje po funkcji agragującej count(). Gdy jej niema wszystko jest dobrze. O co chodzi?
SongoQ
Poprostu @Jabol zapomnial dodac jednego pola do grupowania => c.name sad.gif

Taka uwaga dodaj index na position - powinno "dodac kopa"
Wasiquard
  1. SELECT count(w.*) AS ilosc, c.id AS id, c.name AS name
  2. FROM category AS c LEFT JOIN wallpaper AS w ON (c.id=w.category) GROUP BY c.id, c.name ORDER BY c.position;

Tak?
Niedziała. Ratunku!
SongoQ
  1. SELECT count(*) AS ilosc, c.id AS id, c.name AS name
  2. FROM category c LEFT JOIN wallpaper w ON (c.id=w.category) GROUP BY c.id, c.name ORDER BY c.position


Jesli nie zadziala napisz jaki blad dostajesz
Wasiquard
No teraz to poszło biggrin.gif DZIEKI!

PS Nie mogę zrobić dużego ę w "dzięki"! Why?
Jabol
Co mu przeszkadza słówko AS? Przecież to jest chyba standart?
I czemu potrzeba dodać dodać c.name do grupowania? Przecież grupowanie po c.id oraz po c.name (oddzielnie) daje chyba to samo (tak zrozumiałem z tematu).

Edit: co do drugiej części -> czy dlatego, że to pole występuje w selekcie?
SongoQ
Cytat
Co mu przeszkadza słówko AS? Przecież to jest chyba standart?

Moge sie mylic ale pamietam ze w dokumentacji PG chyba bylo albo ORACLE ze nie jest wskazane uzywanie AS po tabeli w polach tak ale po tabeli nie

Cytat
I czemu potrzeba dodać dodać c.name do grupowania? Przecież grupowanie po c.id oraz po c.name (oddzielnie) daje chyba to samo (tak zrozumiałem z tematu).

Edit: co do drugiej części -> czy dlatego, że to pole występuje w selekcie?

Jesli uzywasz funkcji agregacji max, min, sum, count, ..... i grupowania to wtedy musisz niestety wymienic wszystkie pola jakie wystepuja po slowie SELECT, wiem ze to uciazliwe ale tak niestety jest.
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.