Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Optymalizacja zapytania
Forum PHP.pl > Forum > Przedszkole
-void-
Witam.
Mam taki problem z optymalizacją zapytania.
Moja struktura bazy schematycznie wygląda tak:
produkty (id auto increment, describe_short - typ int, name_short - typ int, describe_long - typ int, jeszcze jakieś nieistotne pola...)
describe_varchar (id - typ int, describe - typ varchar(30) )
describe_text (id - typ int, describe - typ text)

W tabeli `produkty` przechowuję tylko liczby (takie jest założenie). Kolumna describe_short przechowuje liczbę, pod którą w tabeli describe_varchar można znaleźć krótki opis produktu (maksymalnie 30 znaków). Kolumna name_short również przechowuje klucz obcy dla tej tabeli, jednak nieco inne jest jej zastosowanie (nie jest to istotne). Tabele describe_varchar i describe_text składają się z zestawów id-ciąg tekstowy, w przypadku describe_varchar jest to 30 znaków, w przypadku describe_text - dłuższe teksty.
Chciałbym jednym zapytaniem pobrać wszystkie opisy wszystkich produktów (czyli pobrać dla każdego produktu jego krótki opis, nazwę (pole name_short) oraz dłuższy opis. Nie chcę zmieniać struktury bazy, bo to co przedstawiłem to nie cała aplikacja i zmiana struktury miałaby znacznie poważniejsze konsekwencje. Napisałem taki kod:
  1. <?php
  2. function getProductsProperties()
  3. {
  4. $query = "SELECT dv.describe, dt.describe FROM produkty AS p, describe_varchar AS dv,
     describe_text AS dt WHERE "
    ;
  5. $query .= "(p.describe_short=dv.id OR p.name_short=dv.id) AND p.describe_long=dt.id";
  6. $result = mysql_query($query);
  7. if (!$result || !mysql_num_rows($result))
  8. {
  9. return false;
  10. }
  11. $i = 0;
  12. while ($row = mysql_fetch_row($result))
  13. {
  14. if (!($i%2))
  15. {
  16. $array['descShort'][] = $row[0];
  17. $array['descLong'][] = $row[1];
  18. }
  19. else
  20. {
  21. $array['name'][] = $row[0];
  22. }
  23. $i++;
  24. }
  25. return $array;
  26. }
  27. ?>

Ale chciałbym, żeby już mysql_fetch_row bądź mysql_fetch_array zwracało poprawną tablicę. Przy tak sformułowanym zapytaniu wyników w tabeli $array['descLong'] mam 2 razy za dużo (po 2 razy te same), co jest zresztą logiczne, patrząc na warunki - (coś1 OR coś2) AND coś3 powoduje że coś3 występuje dwukrotnie więcej niż powinno. Może jakiś inny sposób łączenia tabel? Nie widzi mi się sprawdzanie reszty z dzielenia iteratora przez 2, jak w powyższym przykładzie sad.gif
Mam nadzieję że dobrze opisałem problem i że nie jest on zbyt trudny dla Was...
Z góry dzięki za pomoc.
phpion
Możesz dać SELECT DISTINCT... ale z tego co widzę to brakuje Ci złączenia tabel dla tabeli z aliasem dv. Dodaj warunek analogiczny dla p.describe_long=dt.id.
-void-
Nie rozumiem, co znaczy `analogiczny` sad.gif
Kombinowałem na różne sposoby, ale żaden z wyników nie był zadowalający.

Chodzi o to, że pobieram trzy rzeczy, a nazwy kolumn pobieranych są tylko dwie, bo mam tabelę, w której są różne opisy, dotyczące różnych cech obiektów. W jednej tabeli mogę znaleźć nazwę produktu i jego krótki opis. Jak coś takiego w ogóle obrabiać? Bo poza sprawdzaniem reszty z dzielenia nie przychodzi mi nic do głowy, a to dość mało elegancki sposób...
Kod:
  1. <?php
  2. while ($row = mysql_fetch_row($result))
  3. {
  4. $array['name'][] = $row[0];
  5. $array['text'][] = $row[1];
  6. $array['single'][] = $row[0];
  7. }
  8. ?>

daje dokładnie tyle:
Kod
array(3) {
  ["name"]=>
  array(4) {
    [0]=>
    string(6) "Nazwa1"
    [1]=>
    string(11) "KrótkiOpis1"
    [2]=>
    string(6) "Nazwa2"
    [3]=>
    string(11) "KrótkiOpis2"
  }
  ["text"]=>
  array(4) {
    [0]=>
    string(24) "Dłuższy opis numer jeden"
    [1]=>
    string(24) "Dłuższy opis numer jeden"
    [2]=>
    string(22) "Dłuższy opis numer dwa"
    [3]=>
    string(22) "Dłuższy opis numer dwa"
  }
  ["single"]=>
  array(4) {
   [0]=>
    string(6) "Nazwa1"
    [1]=>
    string(11) "KrótkiOpis1"
    [2]=>
    string(6) "Nazwa2"
    [3]=>
    string(11) "KrótkiOpis2"
  }
}


Jak widać, sieczka, bo we wszystkich częściach tablicy (name, text i single) chcę mieć po 2 elementy. Chcę, żeby to wyglądało tak:
[code]
array(3) {
["name"]=>
array(2) {
[0]=>
string(6) "Nazwa1"
[1]=>
string(6) "Nazwa2"
}
["text"]=>
array(2) {
[0]=>
string(24) "Dłuższy opis numer jeden"
[1]=>
string(22) "Dłuższy opis numer dwa"
}
["single"]=>
array(2) {
[0]=>
string(11) "KrótkiOpis1"
[1]=>
string(11) "KrótkiOpis2"
}

Rozumie mnie ktoś w ogóle? tongue.gif
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.