[MySQL] Problem z zapytaniem - duplikat

0

Witam.

Gdyby to nie było API MySQL w C++ to może nie było by problemu z zapytaniem :) .

Otóż struktura bazy jest następująca.

DB test
-----------TB firma
-----------TB telefony

TB firma
--id (PRIMARY KEY, AUTOINCREMENT)
--nazwa
--siedziba
--oddzialy
--strona
--dzialalnosc
--nip
--notatka

TB telefony
--id_firmy
--imie
--nazwisko
--funkcja
--telefon

Teraz, chciałbym wykonać zapytanie które zwróciłoby mi wszystkie pola z TB telefony oraz pole "nazwa" z TB firma :

Id Imię Nazwisko Funkcja Telefon Nazwa firmy do której należy pracownik.

Tabele powiązane są polami id oraz id_firmy.

Wykonuje takie zapytanie :

SELECT id_firmy, imie, nazwisko, funkcja, telefon, nazwa  
FROM telefony , firma 
GROUP BY id_firmy, imie, nazwisko, funkcja, telefon, nazwa

I jeśli w tabeli telefony są dwie osoby to w wyniku zapytania mam ich duplikaty. Czyli zamiast pojawić się raz pojawiają siędwa razy.

Jak można sobie z tym poradzić ?

Z góry dziękuję za info.

Pozdrawiam.

0

SELECT
F.nazwa, T.id_firmy, T.imie, T.nazwisko, T.funkcja, T.telefon
FROM
firma F JOIN telefony T ON T.id_firmy = F.id

powinno zwrócic to co chcesz :)
PS. jezeli wypisujesz dane z kilku tabel, to nalezy je łączyć uzywajac '... JOIN ... ON ' bo w przeciwnym wypadku robiony jest iloczyn kartezjański tabel wypisanych po "FROM ... , ... "; ewentualnie można w tym przypadku podac w klauzuli WHERE warunek "WHERE T.id_firmy = F.id" i tez bedzie działac :)

0

Witam,

SELECT DISTINCT id_firmy, imie, nazwisko, funkcja, telefon, nazwa
FROM telefony , firma
GROUP BY id_firmy, imie, nazwisko, funkcja, telefon, nazwa

distinct - unikalne rekordy

Pozdrawiam
</ort>

0

Lub:

SELECT f.id_firmy, t.imie, t.nazwisko, t.funkcja, t.telefon, t.nazwa 
FROM telefony t , firma f
WHERE t.id = f.id_tel

Ale to tylko w przypadku gdy zmienisz pola w tabeli, inaczej nie bedzie to dzialalo, poniewaz nie masz powiazania jednej tabeli z druga.

Rozwiazanie z DISTINCT odradzam, gdyz jest to nieefektowne rozwiazanie.
Rozwiazanie z JOIN tez nie zadziala w tym przypadku, gdyz jak juz wspomnialem nie ma powiazania pierwszej tabeli z druga, nastomiast zadziala jezeli dorzucisz np kolumne id_tel w tabeli firma (zrobisz w ten sposob powiazanie tabel)

0
cobra napisał(a)

Ale to tylko w przypadku gdy zmienisz pola w tabeli, inaczej nie bedzie to dzialalo, poniewaz nie masz powiazania jednej tabeli z druga.

Jak to nie ma powiązania? A pole id_firmy w tabeli telefony?

Rozwiazanie z DISTINCT odradzam, gdyz jest to nieefektowne rozwiazanie.
Rozwiazanie z JOIN tez nie zadziala w tym przypadku, gdyz jak juz wspomnialem nie ma powiazania pierwszej tabeli z druga, nastomiast zadziala jezeli dorzucisz np kolumne id_tel w tabeli firma (zrobisz w ten sposob powiazanie tabel)

W takim wypadku jadna firma będzie mogła mieć jeden telefon, co jest raczej mało sensowne. W oryginalnym przykładzie firma może mieć wiele telefonów, a każdy telefon "należy" (poprzez pole id_firmy) do jednej firmy.</quote>

Rozwiazanie z DISTINCT odradzam, gdyz jest to nieefektowne rozwiazanie.

Zgadza się, w tym przypadku zostanie utworzona mega-tabela każdy wiersz z tabeli firma z każdym wierszem w tabeli telefony (1000*100)1000 (100mln - poprawcie mnie, jeśli coś pokręciłem). W przypadku JOINa DBMS utwoży tabelę 1000100 wierszy (100tys. połączy telefony tylko z odpowiednimi firmami).

0

Zgodze sie ze w tabeli telefony jest pole id_firmy, ale bardziej potraktowalem to pole jako index dla tabeli telefony, a nie jako powiazanie z firma. Zrobilem to wlasnie z tego powodu ze firma moze miec kilka telefonow a wtedy nie bedziemy mieli klucza dla tabeli telefony.

No i oczywiscie jeszcze jedno poniewaz wkradl sie maly blad, chodzilo mi o dolozenie w tabeli telefony nowego pola a nie w tabeli firma

0
cobra napisał(a)

Zgodze sie ze w tabeli telefony jest pole id_firmy, ale bardziej potraktowalem to pole jako index dla tabeli telefony, a nie jako powiazanie z firma. Zrobilem to wlasnie z tego powodu ze firma moze miec kilka telefonow a wtedy nie bedziemy mieli klucza dla tabeli telefony.

No i oczywiscie jeszcze jedno poniewaz wkradl sie maly blad, chodzilo mi o dolozenie w tabeli telefony nowego pola a nie w tabeli firma

I wszystko jasne. Ja z kolei nie zauważyłem braku id w telefony, w przeciwnym wypadku może odgadł bym Twoje intencje :)
[browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1