Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jak optymalnie zaprojektować zapytania?
prowseed
post
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ć?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Sephirus
post
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"??

  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


--------------------
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...
Go to the top of the page
+Quote Post
melkorm
post
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 smile.gif


--------------------
Go to the top of the page
+Quote Post
Sephirus
post
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ć smile.gif


--------------------
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...
Go to the top of the page
+Quote Post
prowseed
post
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.


--------------------
Go to the top of the page
+Quote Post
zegarek84
post
Post #6





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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 ;]

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ę.

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 10:02