Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak optymalnie zaprojektować zapytania?
Forum PHP.pl > Forum > Bazy danych > MySQL
prowseed
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ć?
Sephirus
Ok może Cię źle zrozumiałem ale to mi wygląda na podstawowe użycie "GROUP_CONCAT"??

  1. SELECT GROUP_CONCAT(tresc) AS tresci FROM tabelka GROUP BY kategoria ORDER BY kategoria ASC


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:

  1. SELECT DISTINCT kategoria FROM tabelka


Mamy wszystkie kategoria w tablicy to następnie dla każdej pobieramy treści

  1. SELECT * FROM tabelka WHERE kategoria = {$kategoria}


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 smile.gif
melkorm
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 smile.gif
Sephirus
Ale to nie zmienia w sumie nic w stosunku do pierwszej koncepcji autora... dalej zwracane będą wszystkie rekordy, które PHP musi przemielić smile.gif
prowseed
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.
zegarek84
Cytat(prowseed @ 8.03.2012, 03:52:06 ) *
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 ;]
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.