Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zapytania
Wasiquard
post 24.07.2005, 22:29:21
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 12.11.2004

Ostrzeżenie: (10%)
X----


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ć.


--------------------
Tworzenie stron www | Muzyka z filmów
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
crash
post 24.07.2005, 22:44:24
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 196
Pomógł: 2
Dołączył: 17.01.2004
Skąd: Sosnowiec

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


  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...


--------------------
Go to the top of the page
+Quote Post
Jabol
post 25.07.2005, 12:04:45
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


  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;


Ten post edytował Jabol 25.07.2005, 12:06:45
Go to the top of the page
+Quote Post
Wasiquard
post 26.07.2005, 14:44:01
Post #4





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 12.11.2004

Ostrzeżenie: (10%)
X----


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?


--------------------
Tworzenie stron www | Muzyka z filmów
Go to the top of the page
+Quote Post
SongoQ
post 26.07.2005, 15:01:43
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%)
-----


Poprostu @Jabol zapomnial dodac jednego pola do grupowania => c.name sad.gif

Taka uwaga dodaj index na position - powinno "dodac kopa"


--------------------
Go to the top of the page
+Quote Post
Wasiquard
post 26.07.2005, 22:17:04
Post #6





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 12.11.2004

Ostrzeżenie: (10%)
X----


  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!


--------------------
Tworzenie stron www | Muzyka z filmów
Go to the top of the page
+Quote Post
SongoQ
post 26.07.2005, 22:31:55
Post #7





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


  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


--------------------
Go to the top of the page
+Quote Post
Wasiquard
post 26.07.2005, 22:36:15
Post #8





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 12.11.2004

Ostrzeżenie: (10%)
X----


No teraz to poszło biggrin.gif DZIEKI!

PS Nie mogę zrobić dużego ę w "dzięki"! Why?

Ten post edytował Wasiquard 26.07.2005, 22:39:04


--------------------
Tworzenie stron www | Muzyka z filmów
Go to the top of the page
+Quote Post
Jabol
post 26.07.2005, 23:14:47
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


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?

Ten post edytował Jabol 26.07.2005, 23:18:13
Go to the top of the page
+Quote Post
SongoQ
post 26.07.2005, 23:52:55
Post #10





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


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.


--------------------
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 Wersja Lo-Fi Aktualny czas: 19.07.2025 - 01:37