Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] 2 tabele złaczenie
Forum PHP.pl > Forum > Przedszkole
kielich
Witam mam dość dziwny przypadek i myśle że ktoś pomoże mi go rozwikłać mam mam dwie tabele nazwy,zamowienia (w tabeli zamówienia mam 2 rekordy i w tabeli nazwy mam też 2 rekordy)

chce je połaczyć ale po złączeniu robia sie 4 rekordy dlaczego nie 2 tyle ze sklejone??
o to jak to robie

  1. SELECT nazwy.name, zamowienia.nazwa_prod
  2. FROM nazwy,zamowienia WHERE nazwy.user=zamowienia.klient

otrzymuje zamiast 2 sklejonych rekordów takie cos :

name | nazwa_prod
Kaska | nazwjakas
kowale | Jakas nazwaasdsad
kowale | nazwjakas
Kaska | Jakas nazwaasdsad

Potrzebuje miesc np w taie postaci

name | nazwa_prod
Kaska | nazwjakas
kowale | Jakas nazwaasdsad






nospor
widac dla kazdego nazwy.user odpowiadają dwa rekordy zamowienia.klient
Nie ma więc tu nic dziwnego smile.gif
john_doe
zapytanie wygląda ok. jeśli dostajesz 4 rekordy w wyniku to.... w tabeli zamówień masz, że Kaśka zamówiła dwa przedmioty i ten koleś też.

zrób sobie tak, czytelniej jest
  1.  
  2. SELECT nazwy.name, zamowienia.nazwa_prod
  3.  
  4. FROM nazwy RIGHT JOIN zamowienia ON nazwy.user=zamowienia.klient
  5.  
kielich
nie no mam 2 zamowienia i dwie wpisane nazwy w 2tebeli jedna nazwa do jednego zamowienia w tej i tej tabeli jest ten sam user kurcze ....

chce dokleic same nazwy do tabeli z zamowieniami a robia sie 4 rekordy tak jakby sie mnożyły ;/ jak dokleic same nazwy do zamowien ;/
nospor
pokaz dokladnie co zawiera pierwsza tabela i dokladnie co zawiera druga tabela
thek
A ja myślę, że ma on jakiś bajzel w bazie. Zauważcie, że z dwóch 2-rekordowych tabel zrobił mu połączenie wszyscy do wszystkich czyli pełny iloczyn kartezjański smile.gif
nospor
dlatego właśnie chcę by pokazał dokładnie co on tam ma...
kielich
tabela 1 nazwy
id | name | user

782 | Kaska | Steś
781 | kowale | Staś

tabela 2 zamowienia
id | nazwa_prod | klient

1727 | jakasnazwa | Staś
1726 | jaskasnazwa2 | Staś

wszytskie nie wypisywałem tak jak czas czy cena itp

i tą nazwy z name chce dodac do zamowien
tak jest dokładnie
nospor
"Steś " to literowka? Powinno byc "Staś" ?

No i taki Kowale łączy się z dwoma rekordami popprzez "Staś" czyli jest tak jak mowilismy. Nie wiem skąd u Ciebie takie zdziwienie...
kielich
tak mój blad jest Stas smile.gif czyli nie mozna tego jakos zeby bylo 2 ;/
phpion
Musiałbyś mieć takie dane:
tabela 1 nazwy
id | name | user
782 | Kaska | kas
781 | kowale | kow

tabela 2 zamowienia
id | nazwa_prod | klient
1727 | jakasnazwa | kas
1726 | jaskasnazwa2 | kow
kielich
czyli teraz jak połacze to wychodzi ze zamiast 2 zrobił 4 zamowienia ;/

to jak sie nie da to jak moge najposciej i najwydaniej usunac duplikat
nospor
Cytat
to jak sie nie da to jak moge najposciej i najwydaniej usunac duplikat
a skad bedziesz wiedzial ktory duplikat chcesz usunać? Oba duplikaty łączą sie z tym samym userem...
Lepiej zaprojektuj baze poprawnie smile.gif
kielich
Mam rozwiazenie inne ale nie wiem jak poprostu ununac duplikat moze ktos podac przykład

nospor moze podasz jakies rozwiazanie zebym nie musiał całej bazy rozwalac ;/
nospor
tabela 1
id | name
782 | Kaska
781 | kowale

tabela 2 zamowienia
id | nazwa_prod | id_user
1727 | jakasnazwa | 782
1726 | jaskasnazwa2 | 781
kielich
no to ndala nie rozwiazuje mojego problemu lecz przykład jest jak najbardziej prawidłowy i dział .A dlaczego nie rozwiązuje ponieważ zemy pózniej dodac zamowienie bede musiał to id z tabeli 1 wyciagnac z co za tym idzie pózniej while a ja nie moge miec tego while smile.gif w najgorszym przypadku pózniej musiałbym kasowac duplikaty które niewiem jak.W sumie to bybylo najlepsze rozwiazanie.
nospor
Cytat
.A dlaczego nie rozwiązuje ponieważ zemy pózniej dodac zamowienie bede musiał to id z tabeli 1 wyciagnac z co za tym idzie pózniej while a ja nie moge miec tego while w najgorszym przypadku pózniej musiałbym kasowac duplikaty które niewiem jak.W sumie to bybylo najlepsze rozwiazanie.
Nie obraź się, ale nic nie zrozumiałem z tego "bełkotu"...
jaki while, jakie wyciąganie id? Mowisz o przeniesieniu starej bazy na tę nową strukture czy mowisz już o działaniu od początku na nowej strukturze?
kielich
No bo przy opisie produktu user wybiera sobie jego nazwe poczym je zapisuje do bazy pózniej wybiera przesyłkę i na samym koncu zamawia(insert z zamówieniem do bazy ).No i tak, musze jakoś połączyć wybrana nazwe ze złożonym zamówieniem, albo przed zapisaniem zamówienia wyciągnąć wybraną nazwe i razem z zamowieniem zapisać (i tu musiałbym użyć while czego niemoge zrobić ponieważ insert lezy w foreach i zamówienie sie zapisuje x2) dlatego mówiłem o kasowaniu double. Naprawde innaczej nie potrafie tego opisac. biggrin.gif
nospor
No dobra - ja się poddaje. Każdy kolejny opis zaciąga mnie coraz bardziej w ciemny, niezrozumiały las....
Jak można tak prostą sprawę tak przekombinowac? winksmiley.jpg
No nic, może ktoś inny zrozumie o czym ty do nas rozmawiasz smile.gif
thek
Nospor... taki bełkot jest w każdym jego temacie winksmiley.jpg Zerknij sobie to sam zobaczysz. Ja już w dwóch innych jego odpowiadam i zawsze kręci nosem, że jakieś pętle nie tak itp. smile.gif
Jak dla mnie, nie rozumie on podstaw leżących w bazach danych. Nie wie dlaczego taka, a nie inna struktura powinna być zastosowana, nie mówiąc już o jej wdrożeniu w życie. Gdybyśmy mu podali zapytanie zwracające zamiast stringa liczbę to pewnie też by się burzył, że to nie ma być tak winksmiley.jpg Nawet o strukturze nie wspominam, bo jakaś zmiana w tabelach pociągnęła by zmianę kodu php. A to moim zdaniem jest już dla niego za trudne bo musiałby wiedzieć gdzie co jest i dostosować do zmian. W jednym z tematów choćby swoich dodaje do koszyka przedmioty, nawet jeśli są one dublami, a z tego co zrozumiałem jego wypowiedź to jeszcze bonusem robi to z input text po nazwie, bez jakiejkolwiek walidacji czy obiekt istnieje w bazie produktów blinksmiley.gif
Dla nas takie coś jest niepojęte, ale próby wyjaśnienia mu i dojścia do sedna jego problemu kończą się masłem maślanym. Po 2 lub 3 próbie jego wyjaśnień o przyczynę problemu dojdziesz do punktu wyjścia i swojego pierwszego proponowanego rozwiązania, które znowu odrzuci z tych samych powodów co kilka postów wyżej. Jakbyś pisał z automatem mającym kilka wbudowanych formułek. A gdy już dojdziecie do czegoś, że działa, to wymyśli nowe problemy, tak jak tutaj z dublami. Ja sobie dałem już spokój z jego tematami bo nawet osoba mająca jakieś podstawy i potrafiąca sensownie pisać potrafiła by zapewne lepiej wyjaśnić czego chce. Uważam nawet, że z niemal kompletnie zieloną w temacie programowania dziewczyną (choćby jolam) łatwiej się porozumieć niż zrozumieć jego wywody.
askone
Hej

Dorzucę i ja swoje trzy grosze w temacie winksmiley.jpg Rozwiązanie zaproponowane przez nospor'a jest zgodne ze standardami projektowania relacyjnych baz danych. Według mnie to rozwiązanie optymalne i nie widzę w nim żadnego problemu winksmiley.jpg Uzupełniłbym jeszcze te 2 tabele o 3 zawierającą listę wszystkich towarów dostępnych w sklepie.

Kod
Table Klienci
Id int
Name text

Table Towary
Id int
Name text

Table Zamowienia
Id int
Id_towar int
Id_klient int


Nie rozumiem dlaczego problemem jest odczytanie id klienta przy składaniu zamówienia? Czyżby system pozwalał składać zamówienia na podstawie nazwy klienta wpisanej "ręcznie"? Jeśli tak to gratuluję pomysłowości smile.gif Wtedy pozostaje tylko czekać jak ktoś bystry zamówi towar na konto innego klienta - bo będzie znał jego nazwę...

Według mnie to aby złożyć zamówienie musi być logowanie, wtedy sprawdzasz dane wpisane przez klienta i pobierasz jego id. Później trzymasz je w sesji i dodajesz do każdego rekordu zamówienia jakie w trakcie tej sesji będziesz wpisywał do bazy. Proste i niezawodne.

Pozdrawiam
kielich
Po pierwszy thek Nie nie mówiłem ze wpisywana nazwa nie jest filtrowana czy cos w tym rodzaju dla twojej wiadomosci jest własna funkcja filtrujaca wchodzących i wychodzący danych z i do bazy smile.gif Ogólnie może nie napisałem jasno o co chodzi ale następnym razem zastanów się nad tym co ty robisz i jak to wykonujesz zanim zaczniesz kogos krytykowac.
Pisząc to chciałem dać podziękowania dla nospor'a "zapaliłeś latarkę w tym ciemnym lesie dzięki temu udało mi sie z niego wyjsc" smile.gif jeszcze raz THX


do zamknięcia
thek
Więc na przyszłość kielich radzę przejrzeć swoje posty przed wduszeniem "Wyślij". Nie jest to złośliwość, bo gdybym taki był to czepiałbym się do ogromnej masy literówek jakie są w Twoich postach. Ale zwrot z innego Twojego tematu, w stylu "wstawiając do tablicy nazwę, którą użytkownik wpisuje do formularza" jawnie wskazuje na niemal kompletny brak walidacji. Właśnie takie opisy sprawiają, że nikt nie wie jak działają Twoje skrypty, co się dzieje na poszczególnych etapach z danymi, czy struktura bazy jest odpowiednia. Wszystko to trzeba wyciągać z Ciebie siłą. Dla przykładu zobacz sobie mój temat z problemem:
http://forum.php.pl/index.php?showtopic=133606
Teraz porównaj ile istotnych danych tam zamieściłem wraz z kilkoma próbami rozwiązania problemu zanim się poddałem i napisałem temat. Wszystkie warianty moich pomysłów opisałem by inni nie musieli mi podawać rozwiązań jakie już przetestowałem.
Widzisz różnicę między Twoimi tematami a moim? Ja podaję to, co może się innym przydać w rozwiązaniu mojego problemu sam od siebie. Osoba czytająca wie po nim już niemal wszystko co potrzebne i jedynie niuanse mogą być niejasne. Dla problemu jaki Ty masz nie znamy w zasadzie nic. Do któregoś momentu nie znaliśmy struktury tabel (poproszono Cię o podanie), nie znamy kodu operującego na tych danych, nie wiemy jak te dane są obrabiane, do czego potrzebne, czy nie są powiązane z czymś co może być istotne by rozwiązać problem. Po prostu rzuciłeś go na forum i czekasz. W momencie zaś gdy są podawane Ci ewentualne rozwiązania nagle okazuje się, że to rodzi problemy następne, wynikające z obsługi tego kodu w jakimś skrypcie lub założeń, o których na początku wcale nie wspominałeś.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.