Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlenie artykułów bez kategorii
Forum PHP.pl > Forum > Bazy danych > MySQL
Kshyhoo
Witam. Chciałbym wyświetlić wszystkie artykuły, takie, które mają kategorie i takie, które nie są przydzielone do żadnej. Tabele:
  1. tutoriale:
  2. tut_id
  3. tut_tytul
  4. tut_autor
  5. tut_data
  6. tut_tresc
  7.  
  8. kategorie:
  9. kat_id
  10. kat_kategoria
  11.  
  12. tut_kat:
  13. id_tut
  14. id_kat

Takim zapytaniem wyciągam listę artykułów, wraz z nazwami kategorii:
  1. SELECT SQL_CALC_FOUND_ROWS tut_id, tut_tytul, tut_autor, tut_data, tut_tresc,
  2. GROUP_CONCAT(kat_kategoria SEPARATOR '<br/>') kategorie
  3. FROM tut_kat, tutoriale, kategorie
  4. WHERE tut_kat.id_tut=tutoriale.tut_id
  5. AND tut_kat.id_kat=kategorie.kat_id
  6. GROUP BY tut_id
  7. ORDER BY tut_id DESC
  8. LIMIT $start, $na_strone

To rozwiązanie ma wadę: nie pokazuje artykułów bez kategorii. Nie mogę spłodzić zapytania, które pokaże wszystkie artykuły.
pmir13
  1. SELECT SQL_CALC_FOUND_ROWS
  2. t.tut_id, t.tut_tytul, t.tut_autor, t.tut_data, t.tut_tresc,
  3. COALESCE( kl.lista_kategorii, '') AS kategorie
  4. FROM
  5. tutoriale t
  6. LEFT JOIN
  7. ( SELECT
  8. id_tut,
  9. GROUP_CONCAT(kat_kategoria SEPARATOR '<br/>') AS lista_kategorii
  10. FROM tut_kat
  11. JOIN kategorie
  12. ON tut_kat.id_kat = kategorie.kat_id
  13. GROUP BY id_tut ) kl
  14. ON t.tut_id = kl.id_tut
  15. ORDER BY t.tut_id DESC
  16. LIMIT $start, $na_strone
Kshyhoo
Wielkie dzięki, działa super. Kombinowałem z zamianą wyświetlanych kategorii na linki, ale poległem. Jeżeli jest jedna kategoria, działa - jeżeli więcej, to problem. Można jakoś ten separator przekombinować?
  1. $lkat = $dane['kategorie'];
  2. echo str_replace($lkat,'<a href="cpax.php?go=tutoriale&k='.$lkat.'&kat='.$lkat.'" class="key">'.$lkat.'</a>',$lkat);

Wiem, że można jakoś w zapytaniu zastosować replace, moje nieudane próby:
  1. GROUP_CONCAT(REPLACE(kat_kategoria, '|', '<br />') SEPARATOR '<br />') AS lista_kategorii
pmir13
W zapytaniu nie trzeba nic kombinować, ewentualnie zmienić <br /> w separatorze na coś wygodniejszego lub zupełnie usunąć - wtedy będzie domyślnie przecinek.
Za to przy wyświetlaniu zrób z tego tablicę i przeleć po niej wyświetlając linki:
  1. $lkat = explode( '<br />', $dane['kategorie'] ); // jak zmieniasz separator to tu też
  2. foreach( $lkat as $kategoria ) {
  3. // link zbudowany z $kategoria;
  4. }
Kshyhoo
Wykombinowałem tak:
  1. SELECT SQL_CALC_FOUND_ROWS
  2. tut_id, tut_nr, tut_obraz, tut_tytul, tut_autor,
  3. COALESCE( kl.lista_kategorii, '') AS kategorie
  4. FROM tutoriale t
  5. LEFT JOIN
  6. (SELECT
  7. id_tut,
  8. CONCAT('<a>',REPLACE(GROUP_CONCAT(kat_kategoria),',','</a><br /><a>'),'</a>') AS lista_kategorii
  9. FROM tut_kat
  10. JOIN kategorie
  11. ON tut_kat.id_kat = kategorie.kat_id
  12. GROUP BY id_tut ) kl
  13. ON t.tut_id = kl.id_tut
  14. ORDER BY t.tut_id ASC
  15. LIMIT $start, $na_strone

i działa... jedynie teraz potrzebuję w <a> wrzucić trochę kodu wink.gif
A rozważę i Twoją propozycję, bo może będzie prościej.

EDIT. Coś mi Twoje ostatnie rozwiązanie nie działa, obcina kategorie do jednej. No i potrzebuję jeszcze id kategorii.
pmir13
Zapytania mysql służą do operacji na danych - w tym przypadku zwracają rekord z listą kategorii, nie służą natomiast do formatowania danych na stronę.
Robienie linków html przez funkcje dla stringów mysql to nie jest dobry pomysł, od tego jest php.
Separator ustawiasz taki, by mieć pewność, że nie występuje w elementach między którymi ma być.
Wtedy otrzymując z bazy listę kategorii możesz łatwo podzielić tą listę na tablicę pojedynczych kategorii przy pomocy explode().
W pętli przechodzisz przez wszystkie elementy tej tablicy i składasz linki do htmla, najzwyczajniej dodając tagi do czystych danych.
Ale jeśli wolisz kombinować z replace to sam sobie robisz z prostego problemu bałagan, bo coś się gdzieś nadpisze itp.
Szczerze mówiąc to bardzo jestem ciekaw jak ci się udało obciąć te kategorie do jednej.
Kshyhoo
Już zrezygnowałem z mojego pomysłu smile.gif Za dużo kombinacji.
W sumie, taki kod już powinien wyświetlić listę kategorii:
  1. $lkat = explode('|', $dane['kategorie']);
  2. foreach($lkat as $kategoria) {
  3. $kat = "{$kategoria}";
  4. }

a on obcina. var_dump($lkat); pokazuje piękną tablicę.
pmir13
No to chyba poza petlą wyświetlasz, bo tutaj jedyne co w pętli robisz to podstawianie pod $kat każdej kategorii z tablicy i nadpisywanie na nowo, co w rezultacie oczywiście daje jedynie ostatnią kategorię poza petlą.
Kshyhoo
I to może właśnie problem. Nie mogę sobie z tym poradzić. Podobnie, jak z wyświetleniem pojedynczego rekordu - podobnie jak z listą, nie wyświetla mi bez przydzielonej kategorii.
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.