Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Wyświetlenie duplikujących się rekordów
Forum PHP.pl > Forum > Przedszkole
daggerski
Witam, bardzo proszę popatrzeć na ten plik: http://pastebin.com/YzWiXWjH

Generalnie tak mniej więcej wygląda wynik SELECT z użyciem JOIN w mojej bazie danych.

W tabeli firmy mam id, token, name, address, province, www, info
Natomiast catID i catName są joinowane z innej tabeli.

Mam problem z wyciągnięciem tych danych w loopie bowiem jak widzicie firma o nazwie "Unique" (jak i każda inna) ma dwa wiersze, oba są takie same jednak różnią się numerem kategorii i nazwą kategorii które w ramach relacji pobierane są z innej tabeli.

Problem jest taki że jak np. dodam jakąś firme przynależącą do 30 kategorii(jest ich 40) to dla jednej firmy będę miał 40wierszy tych samych a jedynie różniących się dwoma ostatnimi rekordami. No i jak będę starał się to wszystko wyciągnąć w pętli for to każda firma będzie wyświetlana tyle razy ile kategorii ona ma bowiem tyle wpisów będzie miała w bazie. Jak zrobić tak aby pętla for nawet gdy będzie 40 wierszy dla danej firmy wybierała tylko raz (name, token, address, province, www, info) jako dla każdego wpisu będzie to takie samo a tyle razy ile jest kategorii pobierała rekordy catID i catName?

Pozdrawiam!
mortus
Nadmiarowość danych jest w tej sytuacji uzasadniona i jak najbardziej normalna. Można ją oczywiście zniwelować po stronie bazy danych (w zapytaniu SQL) posługując się funkcją GROUP_CONCAT dla kolumn catId i catName, i grupując (GROUP BY) po nazwie/id firmy (zastanawiają mnie tylko różne id dla tych samych nazw firm w przykładzie, który wkleiłeś, czy to pomyłka? chodzi o to, że firma Unique ma id równe 1 i id równe 2, a tak być nie powinno). Zapytanie wyglądałoby mniej więcej tak:
  1. SELECT `f`.*, GROUP_CONCAT(`k`.`catID` SEPARATOR ',') AS `catIDs`, GROUP_CONCAT(`k`.`catName` SEPARATOR ',') AS `catNames` FROM `firmy` `f` LEFT JOIN `kategorie` `k` GROUP BY `f`.`id`

Do tego oczywiście możesz dodać odpowiednie sortowanie. To co znajdzie się w wyniku zapytania w pseudokolumnach catIDs i catNames trzeba odpowiednie wyekstrahować po stronie PHP (explode()) przy czym kolejność catIDs odpowiada kolejności catNames.

O takim grupowaniu pisał co nieco nospor, poszukaj artykułu na jego stronie/blogu. Nie testowałem nigdy wydajności tego rozwiązania, więc nie wiem, czy będzie ono wystarczająco wydajne.
daggerski
Dzięki Mortus. GROUP_CONCAT załatwiło sprawę.

Funkcja ta jest bardzo fajnie pokazana tutaj http://epicweb.pl/2009/06/28/funkcja-group-concat/
, na podstawie query które jest tam zaprezentowane zrobiłem własne i wszystko działa


Pozdrawiam!
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.