![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 433 Pomógł: 64 Dołączył: 29.01.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Jest 3:42... Co ja chcę napisać... Zacznę od tego jak wyglądają wpisy w bazie Kod [ id | kategoria | treść ] Wpisów jest już sporo więc mam ograniczone możliwości zamodelowania tego w jakiś inny sposób. Nie bardzo wiem natomiast w jaki sposób stworzyć optymalne zapytania do bazy danych. A co chcę osiągnąć? Kategoria, to jedna litera. Najpiękniej by było, gdyby zapytanie zwróciło całą kolumnę i skrypt sprawdzał jakie literki występują i tworzył na tej podstawie grupy w widoku. I teraz dla każdej grupy kategorii przyporządkował odpowiednie jej treści, czyli baza może wyglądać tak: Kod [1 | A | wpis1 ] [2 | A | wpis2 ] [3 | A | wpis3 ] [4 | B | wpis4 ] [5 | A | wpis5 ] [6 | D | wpis6 ] [7 | G | wpis7 ] [8 | G | wpis8 ] I teraz co chcę osiągnąć w wyniku zapytania: Kod A -> wpis1, wpis2, wpis3, wpis5 B -> wpis4 D -> wpis6 G -> wpis7, wpis8 inne litery się nie wyświetlają, natomiast gdy zostanie dodany wpis Kod [9 | U | wpis9 ] to wynik już powinien wyglądać tak: Kod A -> wpis1, wpis2, wpis3, wpis5 B -> wpis4 D -> wpis6 G -> wpis7, wpis8 U -> wpis9 Ktoś mi powie jak to mądrze ugryźć? Niby coś tam sobie napisałem, ale to wygląda tak okropnie, że nie mogę na ten kod patrzeć... Robie tak, że pobieram z bazy wszystko co mam, lecę while'em po wyniku, sprawdzam warunek na inarray dla kategorii, jak jest, to dopisuje 'wpis', jak nie ma, to tworze w tablicy kategorie i dodaje wpis. No, potem jakieś wyświetlanie... Da się to jakoś bardziej SQL'owo zrobić? -------------------- |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ok może Cię źle zrozumiałem ale to mi wygląda na podstawowe użycie "GROUP_CONCAT"??
Tyle, że to oczywiście zwraca w "tresci" same treści oddzielone przecinkiem i do tego ma jakieś ograniczenia... Twoje rozwiązanie jest niewydajne z poziomu PHP.. IMO lepiej już zrobić tak:
Mamy wszystkie kategoria w tablicy to następnie dla każdej pobieramy treści
I mamy treści dla każdej kategorii (możemy ograniczać ich liczbę, sortować jak chcemy itd...) Dla niewielkiej liczby kategorii to rozwiązanie chyba jest lepsze ![]() -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Cytat Mamy wszystkie kategoria w tablicy to następnie dla każdej pobieramy treści No to jak mamy wszystkie kategorie to użyjmy IN i mamy jedno zapytanie a nie tyle ile jest kategorii ? Później w PHP to poskładać i mamy dwa zapytania ![]() -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ale to nie zmienia w sumie nic w stosunku do pierwszej koncepcji autora... dalej zwracane będą wszystkie rekordy, które PHP musi przemielić
![]() -------------------- If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;) Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka... |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 433 Pomógł: 64 Dołączył: 29.01.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dzięki Sephirus za pomoc, co prawda drugie rozwiazanie jest niezle, martwi mnie natomiast ilosc zapytan. Na razie kategorii jest siedem wiec wszystko dziala w miare sprawnie, natomiast domyslnie ma byc cos kolo 26 : ) Mimo wszystko wydaje sie dzialac szybciej, niestety zapomnialem microtime'em sprawdzic moje rozwiazanie. Na uwadze mam jednak fakt, ze ograniczenia na procesorze sa na serwerze tez i chcialbym zrzucic na baze tyle ile moge. GROUP_CONCAT jest fajne, zaraz tez sprobuje cos skleic pod tym katem.
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
Ktoś mi powie jak to mądrze ugryźć? Niby coś tam sobie napisałem, ale to wygląda tak okropnie, że nie mogę na ten kod patrzeć... Robie tak, że pobieram z bazy wszystko co mam, lecę while'em po wyniku, sprawdzam warunek na inarray dla kategorii, jak jest, to dopisuje 'wpis', jak nie ma, to tworze w tablicy kategorie i dodaje wpis. No, potem jakieś wyświetlanie... Da się to jakoś bardziej SQL'owo zrobić? Przecież i tak musisz pobrać wszystkie wiersze, więc to zrób jednak nie wczytuj do tablicy!!! a od razu wyświetlaj dane w widoku... SELECT * FROM tabela ORDER BY kategoria potem dane otrzymane wyciągaj wiersz po wierszu a nie do tablicy i dalej sprawdzasz czy jest ta sama kategoria co w zmiennej, jeśli tak to dodajesz przecinek i następny wpis, jeśli inna kategoria to korzystasz z funkcji do wyświetlania kategorii i dodajesz świeży wpis... oczywiście piszę o funkcjach widoku - nie buforuj danych nie potrzebnie ;] Ten post edytował zegarek84 8.03.2012, 23:12:58 -------------------- Jeśli twoja ręka rusza do przodu powstrzymaj swój gniew; gdy wyprzedza cię twój gniew - wycofaj rękę.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 10:02 |