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.
SELECT p.name, d.domain_name, FROM domains d LEFT JOIN persons p ON d.id_person = p.id AND d.next_staff_id_person != p.id
https://www.db-fiddle.com
Wrzuć przykładową strukturę.
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
SELECT p.name, (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id) FROM persons p WHERE (SELECT count(d.domain_name) FROM domains d WHERE d.next_staff_id_person=p.id)>=2
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
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
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
Nom, dokladnie to zrozumialem i dokladnie na to udzielilem odpowiedzi
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
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
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
Ok, ale skoro interesuja cie osoby, to FROM ma byc po OSOBACH a LEFT JOIN po domenach. w przeciwnym wypadku dupa
No i grupuj i zliczaj po ID a nie po NAME
W tabeli "domains" mam trzy domeny które mają taki sam "p.id" jednak poniższe zapytanie zwraca tylko jeden rekord z domeną
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
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
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.
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
potrzebuje tego do statystyk, tak abym miał imię i nazwisko danej osoby i przypisane do tej osoby domeny
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
statystki wyświetlam bezpośrednio na stronie, jednak nie wiem jak to ogarnąć aby z jednej kolumny wyświetlał się tylko jeden rekord
Czyli rozumiem na stronie obslugiwanej przez php tak? Podstawy php znasz?
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
No moje zapytania zwraca ci tylko jeden wiersz dla osoby wiec w czym problem? Odnosnie osoby nie musisz juz nic kombinowac bo jest tylko jedna.
Teraz, jak masz domeny w postaci:
domena1,domena2,domena3
to po wyswietleniu wiersza z osoba, robisz explode() po przecinku z pola domena i masz tablice po ktorej lecisz FOREACH i wyswietlasz kolejne wierszy dla domen i masz to co chciales.
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)