Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]JOIN + GROUP_CONCAT błedne działanie
inomi13
post 15.01.2020, 12:20:54
Post #1





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


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"







Ten post edytował inomi13 15.01.2020, 12:26:23
Go to the top of the page
+Quote Post
trueblue
post 15.01.2020, 12:31:14
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
inomi13
post 15.01.2020, 12:35:59
Post #3





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


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"
Go to the top of the page
+Quote Post
trueblue
post 15.01.2020, 12:49:36
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
inomi13
post 15.01.2020, 13:01:54
Post #5





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post 15.01.2020, 13:05:16
Post #6





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
inomi13
post 21.01.2020, 12:13:01
Post #7





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


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


Ten post edytował inomi13 21.01.2020, 12:13:22
Go to the top of the page
+Quote Post
nospor
post 21.01.2020, 12:19:45
Post #8





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
inomi13
post 21.01.2020, 12:40:34
Post #9





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


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.


Ten post edytował inomi13 21.01.2020, 12:43:09
Go to the top of the page
+Quote Post
nospor
post 21.01.2020, 14:51:36
Post #10





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
inomi13
post 21.01.2020, 15:14:30
Post #11





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


grupując względem id domeny i tak dostaje zdublowane rekordy
Go to the top of the page
+Quote Post
nospor
post 21.01.2020, 15:19:12
Post #12





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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

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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
inomi13
post 22.01.2020, 08:33:40
Post #13





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


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"





Go to the top of the page
+Quote Post
nospor
post 22.01.2020, 10:25:04
Post #14





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 07:49