Dane z 3 tabel w 1 zapytaniu

0

Hej!

Mam 3 tabele

Samochody:
id / rejestracja / idWlasciciela

1 / XX84568 / 1
2 / XX77411 / 2
3 / XX11561 / 5

GrupyWłaścicieli:
id / idGrupy / idWlasciciela

1 / 1 / 1
2 / 1 / 4
3 / 2 / 2
4 / 3 / 5
5 / 3 / 6
6 / 3 / 7

Właściciele:
id / imie i nazwisko / data urodzenia

1 / Jan Kowalski /  07.07.2007
2 / Adam Daj / 09.02.2002
itd...

Niektóre samochody posiadają kilka właścicieli wpisanych do dowodu. Niestety ktoś wcześniej oparł to rozwiązanie o 3 tabele w bazie danych. Teraz muszę masowo pobrać np. 1000 samochodów wraz z danymi właścicieli. Do tej pory wybierany był tylko 1 samochód na raz, dlatego od strony PHP wyglądało to tak:

  1. Pobierz samochody,
  2. Dla każdego samochodu pobierz id właścicieli z grupy właścicieli na podstawie Samochody->Wlasciciel
  3. Pobierz dane właścicieli na podstawie listy id z punktu 2.

Przy 1000 samochodów może to oznaczać nawet 3000 żądań do bazy danych (2-3 pętle foreach).

Ciekaw jestem czy SQL jest w stanie zwrócić dane z 2 niezależnych tabel o innych strukturach, jednocześnie przyporządkowując dane z tabeli 2 do wierszy z tabeli 1... Ja już się poddałem. Ale może ktoś mnie zaskoczy. :)

2

A czy poniższe pojęcia/tematy są Ci znane? Próbowałeś to jakoś w ten sposób ogarnąć? Napisałeś, że walczyłeś z problemem, ale nie napisałeś konkretnie co i jak próbowałeś zrobić.
https://www.dofactory.com/sql/join
https://stackoverflow.com/questions/9113466/how-to-merge-2-completely-different-tables

Pytanie jeszcze, czy "w razie WU" masz możliwość edycji tych tabel, np. wprowadzenia kluczy obcych, czy musimy działać jedynie w oparciu o to, co mamy?

3

To że ktoś to zrobił na 3 tabelach, to świetny pomysł. Tak to się robi w przypadku połączeń wiele do wielu.
To, że jest wykonywanie 3000 zapytań to głupi pomysł, skoro można to zrobić jednym.
HINT: USE JOINS

1

A jaki chcesz osiągnać rezultat w wyniku zapytania sql? Taki?
Id_pojazdu / Id właściciela / Imię_nazwisko_właściciela/ data_urodzenia

Jeśli tak - to jak będziesz odróżniał który użytkowników, którzy są aktualnymi posiadaczami? A co jeśli użytkownik A sprzed samochód dla B, a po kilku latach go odkupi? Wypadałoby trzymać w bazie jeszcze takie daty.

Moim zdaniem można, by było tutaj wprowadzić małą poprawkę do bazy - zabrać id grupy właścicieli (idGrupy) i dodać flagę "czy_jest_aktualnym_wlascicielem" (np. na potrzeby szybkiego wynajdywania aktualnego właściciela). Przy okazji do tej samej tabeli można dodać pola z datą od kiedy dany użytkownik jest właścicielem danego pojazdu (zakładam, że pojazd po kupieniu nie może być w stanie "bez właściciela", stąd tylko jedna data. Jak byś zakładał, że pojazd można całkowicie wyrejestrować to dodałbym pole z datą "do kiedy był właścicielem").

Obecnie mając nawet takie 3 tabele, bez problemu można pobrać wszystkie dane. Albo zastosujesz grupowanie i scalisz dane wszystkich właścicieli oddzielajac je np jakimś separatorem, albo po prostu dostaniesz powielone ID samochodów- ale z różnymi właścicielami.

No i tak jak piszą przedmówcy - JOIN'y są receptą na ten problem.

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