![]() |
![]() ![]() |
![]() |
--void-- |
![]()
Post
#1
|
Goście ![]() |
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:
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 ![]() Mam nadzieję że dobrze opisałem problem i że nie jest on zbyt trudny dla Was... Z góry dzięki za pomoc. |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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-- |
![]()
Post
#3
|
Goście ![]() |
Nie rozumiem, co znaczy `analogiczny`
![]() 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:
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? ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 28.06.2025 - 12:01 |