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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
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.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
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 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 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.


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
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: 20.08.2025 - 14:47