Mapowanie wyników zapytania na wyniki innego zapytania po ID

Odpowiedz Nowy wątek
2011-07-20 14:55
0

Myślę, że taki wątek gdzieś już istnieje, ale nie wiem jak go sformułować w wyszukiwarce przez co nie umiem znaleźć.

Mam takie tabelę (zapiszę w uproszczony sposób):

tabela a

IDa
dana_a_1
dana_a_2

tabela b

IDb
a [odpowiada IDa z tabeli a]
dana_b_1
dana_b_2

tabela c

IDc
b [odpowiada IDb z tabeli b]
dana_c_1
dana_c_2

I teraz chciałbym w jednym zapytaniu (jeśli to możliwe) zrobić poniższe rzeczy:

  1. Znając IDc wyciągnąć dane w postaci: {IDc,b,dana_c_1,dana_c_2,a,dana_b_1,dana_b_2,dana_a_1,dana_a_2}

  2. Wyciągnąć wszystkie pola z bazy c w postaci:
    [{IDc,b,dana_c_1,dana_c_2,a,dana_b_1,dana_b_2,dana_a_1,dana_a_2},...]

  3. Dla punktu 1,2 w przypadku gdy któreś powiązane pole nie istnieje uzupełnić je jakimiś zdefiniowanymi wartościami. np.: dana_b_1=-1 itd.

jeśli jest możliwość to chciałbym również zmienić nazwy pól w wyniku na np.: tabelab_dana_b_1 - chodzi o dodanie prefiksu, ponieważ zdarza się że w moim przypadku nazwy pól w bazie są takie same (np. pole: nazwa).

Aktualnie to co wyżej opisałem robię w PHP tak:

  1. Wykonuję kilka zapytań i wyniki z zapytań łączę (nie trzeba tłumaczyć - najprościej jak się da).
  2. Wyciągam wszystkie pola z tabel a,b,c - 3 zapytania. Dla tabel a,b robię mapowania w stylu: {IDx => {IDx, dana_x_1, ...}}, następnie łączę wyniki ze sobą. Dzięki temu punkt 3 mam załatwiony, ponieważ mogę w prosty sposób sprawdzić czy pole istnieje w bazie. 3 zapytania wydawały mi się szybsze niż 2x ilosc danych w tabeli c + 1

░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-07-20 16:05
0

Właśnie znalazłem że punkty 1 i 2 da się zrealizować za pomocą polecenia INNER JOIN, jednak nie wiem jak to się zachowa w przypadku nieistniejących ID (punkt 3) i jak takie zapytanie zrealizować


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-07-20 23:32

INNER JOIN pominie rekordy, których nie będzie miał z czym złączyć. Uzyj LEFT OUTER JOIN.

co robi te całe LEFT? nie może być po prostu OUTER JOIN? - krwq 2011-07-21 14:31

Pozostało 580 znaków

2011-07-22 11:51
1

Są trzy rodzaje OUTER JOINÓW:

  1. LEFT OUTER JOIN - uwzględnia rekordy z tabeli lewej strony zapytania, które nie mają odpowiednika w dołączonej tabeli.
  2. RIGHT OUTER JOIN - uwzględnia rekordy z prawej strony zapytania, które nie mają odpowiedników w tabelach do których są dołączane.
  3. FULL OUTER JOIN - uwzględnia rekordy z obu stron zapytania, które nie mają odpowiednika w drugiej tabeli.

Pozostało 580 znaków

2011-07-26 09:49
0

a co do nieistniejących połączeń (w razie gdyby ktoś szukał) to znalazłem funkcę MYSQL: COALESCE, która zwraca pierwszą wartość z listy, która nie jest nullem np.:
SELECT COALESCE(xyz, xyz2, "xyz oraz xyz2 maja wartosc null") FROM abc;


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-07-26 09:51

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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