Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [MySQL][PHP]JOIN + GROUP_CONCAT błedne działanie

Napisany przez: inomi13 15.01.2020, 12:20:54

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"






Napisany przez: trueblue 15.01.2020, 12:31:14

A gdzie użyłeś GROUP_CONCAT i uważasz, że jego działanie jest błędne?

Napisany przez: inomi13 15.01.2020, 12:35:59

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"

Napisany przez: trueblue 15.01.2020, 12:49:36

Zapoznaj się z manualem: https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
Z zasadą stosowania tej funkcji i innych grupujących.

Napisany przez: inomi13 15.01.2020, 13:01:54

Cytat(trueblue @ 15.01.2020, 12:49:36 ) *
Zapoznaj się z manualem: https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_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

Napisany przez: nospor 15.01.2020, 13:05:16

Nie doszedles do sensowego rozwiazania bo zapomniales powiedziec po czym grupujesz.... GROUP BY co

Napisany przez: inomi13 21.01.2020, 12:13:01

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

Napisany przez: nospor 21.01.2020, 12:19:45

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?

Napisany przez: inomi13 21.01.2020, 12:40:34

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.

Napisany przez: nospor 21.01.2020, 14:51:36

Skoro lecisz i grupujesz po domenach, to czemu dajesz GROUP_CONTACT po domenie ? To nie ma najmniejszego sensu teraz

Napisany przez: inomi13 21.01.2020, 15:14:30

grupując względem id domeny i tak dostaje zdublowane rekordy

Napisany przez: nospor 21.01.2020, 15:19:12

Ale nadal robisz group_concat po domenie. Toz powiedzialem ze to bez sensu....

Nie group_concat(d.domain_name)
a poprostu d.domain_name

Napisany przez: inomi13 22.01.2020, 08:33:40

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"






Napisany przez: nospor 22.01.2020, 10:25:04

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)