Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Opuszczanie zerowych rekordów z zapytania.
Grzesiek23
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.12.2009

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


Witam!
Temat bardzo ogólnie opisuje mój problem.

Mianowicie mam dwie tabele:
- category -> id, name, sortOrder
- article -> id, cat_id, name, ...

I teraz chciałbym wyświetlić to wszystko w porządku:
- kategoria
--- artykuł
--- artykuł
--- artykuł
- kategoria
--- artykuł
--- artykuł
...
etc.

Ale ... chciałbym opuścić kategorie, dla których nie ma żadnych artykułów.

Przerabiam swój projekt z ASP.Net i tam mogłem definiować relacje, itd. To co chcę osiągnąć, wykonywało się poprzez jedną linijkę.

Jak to wygląda w PHP?
Miałem zagwozdkę czy opublikować to w tym dziale, czy w MySQL. Jeśli jednak nieodpowiedni dział, to proszę o przeniesienie.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
skowron-line
post
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Jak zrobisz sobie twarde złączenie w where to Ci wykluczy kategorie w których nie ma artykułów.
Go to the top of the page
+Quote Post
Zyx
post
Post #3





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Jest wiele różnych rozwiązań Twego problemu. Zauważ, że w ASP.net zapewne korzystałeś z jakiegoś ORM-a, a tutaj sądząc z Twojego postu, będziesz jechać na czystym SQL-u, więc siłą rzeczy musisz taką sytuację obsłużyć ręcznie. Jakbyś w ASP.net ręcznie wysyłał zapytania, miałbyś dokładnie ten sam problem.

Całość najwydajniej jest pobrać dwoma zapytaniami. Pierwsze pobiera listę kategorii, drugie listę artykułów i dopasowywanie kategorii do artykułów leży już po stronie PHP, przy pomocy mapy identyfikatorów. Gdybyś miał w kategoriach licznik artykułów, mógłbyś już odsiać puste na etapie pobierania:

Kod
SELECT ... FROM category WHERE article_num > 0


Wtedy zapytanie o artykuły zbudowałbyś z użyciem operatora IN:

Kod
SELECT ... FROM article WHERE category_id IN( lista pobranych identyfikatorów kategorii )


Jeżeli jednak tak nie masz, po prostu budujesz sobie tablicę z kategoriami i przypisanymi do nich artykułami, następnie puszczasz pętlę po kategoriach i dla każdej, zwykłym operatorem sizeof() liczysz, ile masz artykułów w podrzędnej tablicy je trzymającej. Jak 0, to usuwasz, jak więcej, zostawiasz.

Ew. możesz też wykorzystać ORM, który zrobi to za Ciebie.
Go to the top of the page
+Quote Post
Grzesiek23
post
Post #4





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 25.12.2009

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


W sumie dodanie kolumny z ilością artykułów wydaje się dużo prostszym rozwiązaniem - jeśli się nie zapomni o aktualizacji tego pola po przeniesieniu artykułu, to chyba najłatwiejsze wyjście.

Tak jeszcze zapytam - co to jest "twarde złączenie". Szczerze mówiąc, to pierwszy raz się spotykam z takim określeniem (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Zyx
post
Post #5





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Hmmm... wydaje mi się, że łatwo się domyślić: SELECT ... FROM foo f INNER JOIN bar b ON f.id = b.foo_id (IMG:style_emoticons/default/smile.gif) . Przeciwieństwo to lekkie złączenia, gdzie brak pasującego wiersza nie oznacza, że wiersz w tabeli nadrzędnej nie znajdzie się w zbiorze wyników.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 21:23