![]() |
![]() |
![]()
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. |
|
|
![]() |
![]()
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.
|
|
|
![]()
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. |
|
|
![]()
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) |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 21:23 |