![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 33 Pomógł: 2 Dołączył: 25.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Piszę książkę telefoniczną w php, używam bazy mysql.
W bazie są trzy tabele: wpisy, kategorie oraz tabela realizująca relację wiele-do-wielu: kategorieWpisy. W tabeli tej znajdują się ID kontaktów i kategorii. Załóżmy, że robię selecta dla potrzeb wyświetlenia tablicy z kontaktami i kategoriami: SELECT wpisy.nazwa, kategorie.nazwa FROM wpisy,kategorie,KategorieWpisy WHERE KategorieWpisy.idkontakt=wpisy.id AND KategorieWpisy.idkategoria=kategorie.id czyli dostaję wynik w formie jednej tablicy z nazwami kontaktów i kategoriami, do których są przypisane. Tablicę tą obsługuję oczywiście w standardowy sposób fetch_array Kiedy dany kontakt jest przypisany do więcej niż jednej kategorii, to wynik dotyczący danego kontaktu otrzymuję w formie dwóch wierszy, na przykład: nazwakontaktu kategoria1 nazwakontaktu kategoria2 Chciałbym, żeby użytkownik zobaczył to w formie: nazwakontaktu kategoria1,kategoria2 Problem leży w tym, że linijka "kategoria2" jest generowana już za następnym przebiegiem pętli while-mysql_fetch_array. W związku z tym nie wiem co zrobić, aby uzyskać żądany efekt. Wycinek kodu; wynik zrzucam do zmiennej buforującej i potem wyrzucam echem.
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Można zrobić tak
Choć nie wiem, czy będzie to optymalne (najszybsze) rozwiązanie. Opcjonalnie to co Ty dostajesz w zapytaniu możesz wrzucić do tablicy (array) i później przetwarzać. i sprawdź sobie co wypluje a będziesz wiedział, jak to "ugryźć". EDIT: Poprawiłem kod. @down: ma być tak jak myślisz. Ten post edytował mortus 30.03.2010, 10:05:44 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 33 Pomógł: 2 Dołączył: 25.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Z tego co widzę, proponujesz osobno pozyskiwać kolejne nazwy wpisów, a potem doklejać do tego w zmiennej buforującej wyszukane nazwy kategorii.
w związku z tym _prawdopodobnie_ wiersz 4 powinien wyglądać tak: albo się mylę. Popraw mnie jeżeli źle to rozumiem. Pomysł jak najbardziej logiczny i bardzo mi się podoba, chociaż zwielokrotnia to ilość wykonanych zapytań i z pewnością nie jest, jak sam powiedziałeś, najbardziej optymalnym rozwiązaniem. Mimo to książka, którą piszę będzie używana na maksymalnie 10 stanowiskach w sieci lokalnej i to rzadko jednocześnie, więc temat wydajności mogę lżej potraktować. Tak jak pisałem, ta koncepcja bardzo mi się podoba i pewnie z niej skorzystam. Jednak zainteresował mnie też drugi pomysł - zrzucenie całego wyniku do tablicy, przetworzenie jej i wyrzucenie na ekran. Mam w związku z tym pomysłem pytanie o wydajność po stronie serwera: załóżmy większe obciążenie bazy, rzędu kilkaset klientów klikających po książce w której jest kilkaset rekordów. Co się dzieje z ramem (-lub cache'm - nie wiem ![]() Tal czy inaczej, dzięki za pomoc, twój post rozwiązał problem. Ten post edytował lukasz_matysek 30.03.2010, 09:59:05 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście trzeba się zastanowić nad sensownym mechanizmem cache'owania takiej dużej tablicy, bo po co ją setki razy generować. Kilkaset wpisów, to raczej nie jest problem (choć to zależy przede wszystkim od "mocy" serwera), problemem będzie kilka tysięcy wpisów. Zauważ tylko, że już przy kilkuset wpisach koniecznością staje się stworzenie stronicowania, bo weź wyświetl kilkaset wpisów jednym ciągiem. A wykorzystując mechanizm stronicowania nie musimy generować, aż tak dużych tablic (podobnie przetwarzanie zapytań do bazy danych nie będzie już "tak nieoptymalne").
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 17:08 |