Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [MySQL]problem z zapytaniem z dwóch tabel
ufo1990
post 16.10.2019, 09:30:47
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


Mam problem z zapytaniem, ponieważ mam dwie tabele. Jedna tabela to "persons" druga "domains". Chcę wyświetlić użytkownika który ma np. dwie domeny lub więcej domen. więc stworzyłem dodatkową kolumnę "next_staff_id_person". Zapytanie działa ale tylko i wyłącznie jeżeli dana osoba ma max dwie domeny, jednak nie działa to jeżeli ktoś ma 3 lub więcej domen.

  1. SELECT p.name, d.domain_name, FROM domains d LEFT JOIN persons p
  2. ON d.id_person = p.id AND d.next_staff_id_person != p.id
Go to the top of the page
+Quote Post
viking
post 16.10.2019, 09:34:10
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


https://www.db-fiddle.com
Wrzuć przykładową strukturę.


--------------------
Go to the top of the page
+Quote Post
poli25
post 16.10.2019, 09:53:48
Post #3





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

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


  1. SELECT p.name, (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id) FROM domains d
  2. WHERE (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id)>=2


miałem błąd powinno być:

  1. SELECT p.name, (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id) FROM persons p
  2. WHERE (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id)>=2


Może nie jest to zoptymalizowane ale jeśli działa to czemu nie robić w ten sposób? heh

Ten post edytował poli25 16.10.2019, 10:41:10
Go to the top of the page
+Quote Post
ufo1990
post 16.10.2019, 10:01:48
Post #4





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


Cytat(poli25 @ 16.10.2019, 10:53:48 ) *
  1. SELECT p.name, (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id) FROM domains d
  2. WHERE (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id)>=2


Zapytanie SQL: Dokumentacja

SELECT p.name, (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id) FROM domains d
WHERE (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id)>=2 LIMIT 0, 25

MySQL zwrócił komunikat: Dokumentacja
#1054 - Nieznana kolumna 'p.name' w field list
Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 10:07:53
Post #5





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




Zapytanie poli jest zdziebka bez sensu.
Rowniez twoj pomysl z dodatkowa kolumna next_staff_id_person jest bezsensu.

To sie robi przez zwykly LEFT JOIN, GROUP BY oraz HAVING

having count() >= 2 - w celu ustalenia warunku na dwie domeny lub wiecej


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

"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
ufo1990
post 16.10.2019, 10:20:10
Post #6





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


Może źle się wyraziłem. Chcę osiągnąć taki efekt jak na zdjęciu tzn. aby "name" wyświetlało jeden rekord z imieniem i nazwiskiem do którego przypisane jest kilka domen

Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 10:59:21
Post #7





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




Nom, dokladnie to zrozumialem i dokladnie na to udzielilem odpowiedzi


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

"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
ufo1990
post 16.10.2019, 11:14:39
Post #8





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


Cytat(nospor @ 16.10.2019, 11:59:21 ) *
Nom, dokladnie to zrozumialem i dokladnie na to udzielilem odpowiedzi

zrobiłem zapytanie jednak wyświetlają mi się dwa rekordy z imieniem.

  1. SELECT p.name, d.domain_name FROM domains d LEFT JOIN persons p ON d.id_person = p.id GROUP BY d.domain_name HAVING count(d.id_person)>= 1

Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 11:16:58
Post #9





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




No bo zle grupujesz. Masz grupac po tym co chcesz miec jedno, czyli osobe. A liczyc masz domeny a nie osoby

No i chciales miec dwie domeny lub wiecej wiec nei >=1 a >=2


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

"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
ufo1990
post 16.10.2019, 11:19:27
Post #10





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


Cytat(nospor @ 16.10.2019, 12:16:58 ) *
No bo zle grupujesz. Masz grupac po tym co chcesz miec jedno, czyli osobe. A liczyc masz domeny a nie osoby

No i chciales miec dwie domeny lub wiecej wiec nei >=1 a >=2


Poprawiłem zapytanie jednak zwraca wynik jednej domeny

  1. SELECT p.name, d.domain_name FROM domains d LEFT JOIN persons p ON d.id_person = p.id GROUP BY p.name HAVING count(d.domain_name)>= 2


Ten post edytował ufo1990 16.10.2019, 11:35:22
Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 11:44:25
Post #11





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




Ok, ale skoro interesuja cie osoby, to FROM ma byc po OSOBACH a LEFT JOIN po domenach. w przeciwnym wypadku dupa wink.gif

No i grupuj i zliczaj po ID a nie po 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
ufo1990
post 16.10.2019, 11:49:43
Post #12





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


W tabeli "domains" mam trzy domeny które mają taki sam "p.id" jednak poniższe zapytanie zwraca tylko jeden rekord z domeną
  1. SELECT p.name, d.domain_name FROM persons p LEFT JOIN domains d ON d.id_person = p.id GROUP BY p.name HAVING count(d.domain_name)>= 2
Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 11:52:18
Post #13





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




No i prawidlowo. Jedna osoba jest przypisana do 3 domen wiec dostaniesz ta jedna osobe. W czym problem? Jesli zas chcesz widziec te wszystkie domeny na liscie to musisz polaczyc te domeny ze soba w SELECT

SELECT p.name, GROUP_CONCAT(d.domain_name) FROM
czy jakos tak. nie pamietam dokladnie skladni group concat


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

"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
ufo1990
post 16.10.2019, 11:59:36
Post #14





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


no właśnie i tu jest problem. Bo chciałbym aby wyświetlał się jeden rekord z imieniem i nazwiskiem i tyle rekordów domen ile jest przypisanych do tej osoby.
Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 12:06:03
Post #15





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




No ale czemu to takie wazne? Poza tym w samym mysql i tak nie osiagniesz tego, ze ci wyswietli jeden rekord osoby a reszte domen. Takie rzeczy w php obrobisz. Co najwyzej jestes w stanie osiagnac ze ci wyswietli tyle rekordow ile domen a w kazdym rekodzie bedzie i osoba i domena. Tylko co to zmieni w porownaniu do powyzszego rozwiazania? No nic


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

"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
ufo1990
post 16.10.2019, 12:16:50
Post #16





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


potrzebuje tego do statystyk, tak abym miał imię i nazwisko danej osoby i przypisane do tej osoby domeny
Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 13:21:58
Post #17





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




No dobrze, ale te statystyki wyswietlasz gdzie? Bezposrednio w bazie czy na stronie? Bo jak na stronie to bez problemu obrobisz to w php by wyswietlalo w formacie jaki chcesz. A jak bezposrednio w bazie patrzysz to daj w group concat ENTER jako lacznik i bedziesz mial oddzielne wiersze jak wizualnie chcesz tak to widziec


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

"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
ufo1990
post 16.10.2019, 14:12:37
Post #18





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


statystki wyświetlam bezpośrednio na stronie, jednak nie wiem jak to ogarnąć aby z jednej kolumny wyświetlał się tylko jeden rekord
Go to the top of the page
+Quote Post
nospor
post 16.10.2019, 14:14:34
Post #19





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




Czyli rozumiem na stronie obslugiwanej przez php tak? Podstawy php znasz?


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

"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
ufo1990
post 16.10.2019, 14:20:23
Post #20





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 26.07.2019

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


zrobiłem pętle while żeby zaciągnąć dane z bazy, jednak nie wiem jaki dać warunek dla $row["name"] aby wyświetlił się tylko jeden rekord z imieniem i nazwiskiem
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 28.03.2024 - 12:18