Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]JOIN + GROUP_CONCAT błedne działanie
Forum PHP.pl > Forum > Przedszkole
inomi13
Witam posiadam bazę danych w której są 3 tabele. Jedna tabela o nazwie persons zawiera dane personalne czyli id i name. Druga tabela o nazwie domains , a trzecia tabela o nazwie e-mail. Tabele połączone są relacjami i poniższe zapytanie działa, jednak chciałbym aby adresy e-mail grupowane były względem danej domeny, natomiast w przypadku kiedy dany użytkownik posiada jedną domenę i 4 adresy e-mail w danej domenie to poniższe zapytanie czterokrotnie wyświetli imię użytkownika i nazwę domeny, a chciałbym aby imię użytkownika, nazwa domeny wyświetla się tylko raz, a adresy e-mail żeby były pogrupowane względem tej domeny.

  1. SELECT p.name, d.domain_name,e.adres_email FROM domains d LEFT JOIN persons p ON d.id_person = p.id LEFT JOIN email e ON d.id = e.id_domain WHERE p.id = "19"





trueblue
A gdzie użyłeś GROUP_CONCAT i uważasz, że jego działanie jest błędne?
inomi13
użyłem tego zapytania, ale wtedy grupuje mi wszystkie adresy e-mail w jednym wierszu

  1. SELECT p.name, d.domain_name, GROUP_CONCAT(e.adres_email SEPARATOR '<br>') AS adresy_email FROM domains d LEFT JOIN persons p ON d.id_person = p.id LEFT JOIN email e ON d.id = e.id_domain WHERE p.id = "19"
trueblue
Zapoznaj się z manualem: https://dev.mysql.com/doc/refman/5.7/en/gro...on_group-concat
Z zasadą stosowania tej funkcji i innych grupujących.
inomi13
Cytat(trueblue @ 15.01.2020, 12:49:36 ) *
Zapoznaj się z manualem: https://dev.mysql.com/doc/refman/5.7/en/gro...on_group-concat
Z zasadą stosowania tej funkcji i innych grupujących.


Korzystałem z tej strony, jednak nie doszedłem do jakiegoś sensownego rozwiązania. Może ktoś coś doradzi
nospor
Nie doszedles do sensowego rozwiazania bo zapomniales powiedziec po czym grupujesz.... GROUP BY co
inomi13
Witam ponownie mam problem z group_concat ponieważ dołożyłem kolejną tabelę "email " i spoiłem ze sobą trzy tabele, jednak ożywając poniższego zapytania dostaje na wyjściu zdublowany wiersz z nazwą domeny. Drugi problem że poniższe zapytanie nie zwróci nazwy domeny która nie posiada adresu email. Proszę o sugestie jak rozwiązać mój problem.

  1. SELECT p.name, p.user, GROUP_CONCAT(e.adres_email ORDER BY d.domain_end SEPARATOR '<hr>') AS adres_email,
  2. GROUP_CONCAT(d.domain_name ORDER BY d.domain_end SEPARATOR '<hr>') AS domain_names FROM domains d LEFT JOIN persons p
  3. ON d.id_person = p.id JOIN email e ON d.id=e.id_domain GROUP BY p.id
nospor
drugi problem: poczytaj o roznicach miedzy JOIN, LEFT JOIN, RIGHT JOIN i nie uzywaj ich w sposob losowy jak to teraz ma miejsce. Dla persons dajesz LEFT JOIN, dla emails JOIN. Dlaczego?
inomi13
join left używam dla persons ponieważ chce do tabeli persons dołączyć elementy z prawej strony czyli z tabeli "domains"

Na szybko używając poniższego zapytania dostaje taki rezultat, a chciałbym aby wiersz onet.pl się nie powtarzał. Nie chce użyć Distinct ponieważ w innych kolumnach będzie data ważności domen które mogą być takie same.
nospor
Skoro lecisz i grupujesz po domenach, to czemu dajesz GROUP_CONTACT po domenie ? To nie ma najmniejszego sensu teraz
inomi13
grupując względem id domeny i tak dostaje zdublowane rekordy
nospor
Ale nadal robisz group_concat po domenie. Toz powiedzialem ze to bez sensu....

Nie group_concat(d.domain_name)
a poprostu d.domain_name
inomi13
Grupując względem d.domain_name było by ok, gdyby nie fakt że mam jeszcze jedną tabelę "persons" więc finalnie chcę mieć wszystko grupowane względem p.id. Zastawiam się czy jestem wstanie do obrobić w jednym zapytaniu. Chyba trochę na mieszałem w tym temacie więc opiszę to jeszcze raz ale dokładniej.

Mam 3 tabele "Persons" "Domain" "email". Tabele są ze sobą połączone "Persons"- > id_persons "Domain" "Domain"-> id.domain"email". Potrzebuje zrobić zapytanie które wypisze mi osobę która posiada jakieś domeny oraz przypisane do nich adresy e-mail. W bazie danych zdarza się że jakaś domena nie posiada adresów email. Stworzyłem poniższe zapytanie który dubluje mi nazwy domen oraz nie wypisuje domen które nie posiadając przypisanego adresu e-mail.

  1. "SELECT p.id, p.name, GROUP_CONCAT(d.domain_name) AS domain_names, GROUP_CONCAT(e.adres_email) as adres_email FROM persons p LEFT JOIN domains d
  2. ON d.id_person = p.id JOIN email e ON d.id=e.id_domain GROUP BY p.id"





nospor
Skoro masz dwa maile przypisane do jednej domeny, to tak bedziesz wlasnie mial jak masz. To po pierwsze
po drugie: mowilem ci: wywal te JOIN... wstaw LEFT JOIN. Jestes oporny na wiedze.

I jak chcesz sie bawic w te GROUP_CONCAT, to potem w php wywal sobie te duplikacje i juz.

A ja osobiscie nie robie zadnego grupowania w takich przypadkach jak ten, tylko potem ladnie w php obrabiam sobie wyniki i mam jak chce. Ale co kto lubi

edit: ewentualnie rozszerz grupowanie jeszcze na domene
GROUP BY p.id, d.id
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.