Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Opuszczanie zerowych rekordów z zapytania.
Forum PHP.pl > Forum > PHP
Grzesiek23
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.
skowron-line
Jak zrobisz sobie twarde złączenie w where to Ci wykluczy kategorie w których nie ma artykułów.
Zyx
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.
Grzesiek23
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 smile.gif
Zyx
Hmmm... wydaje mi się, że łatwo się domyślić: SELECT ... FROM foo f INNER JOIN bar b ON f.id = b.foo_id 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.
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.