Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie zwracające wszystkie wiersze z tabeli A + wiersze z B połączone z A
Forum PHP.pl > Forum > Bazy danych > MySQL
juzew
Witam,

Ugrzęzłem na dobre próbując się z tym uporać - po wielu godzinach walki zdecydowałem się poprosić o pomoc.
Mam w uproszczeniu następującą sytuację:

TABELA A:
id_a | jakas_nazwa | user
1 | bbbbbb | 2
2 | aaaaaaaaaa | 3
3 | cccccccccccc | 2
4 | dddddddddd | 1

TABELA B:
id_b | id_a | user
1 | 2 | 1
2 | 4 | 2
3 | 2 | 2

W tabeli A zapisane sa jakies obiekty. Kazdy z nich domyslnie skojarzony jest z jakims uzytkownikiem. Pojawila sie jednak koniecznosc (w specyficznych przypadkach) skojarzenia obiektu z tabeli A z dodatkowym uzytkownikiem lub uzytkownikami.

Chciałbym zbudować zapytanie (w najprostszym wariancie) które zwróci mi np. id_a, id_b i jakas_nazwa obiektow skojarzonych z danym uzytkownikiem niezalezenie od tego czy informacja o uzytkowniku bedzie zapisana w samej tabeli A czy w dodatkowej B.

Przyklad oczekiwanych wynikow dla usera 2:
id_a | id_b | jakas_nazwa
3 | NULL | cccccccccc
4 | 2 | ddddddddd
2 | 3 | aaaaaaaaa


Zalezy mi tez np. na sortowaniu wynikow po dowolnym polu (np. jakas_nazwa) i limitowaniu ich - dlatego sumowanie wynikow 2 zapytan i pozniejsze ich sortowanie/limitowanie w PHP nie wchodzi w gre (setki tysiecy rekordow...).

Za pomoc bylbym baaaaardzo wdzieczny.

pozdrawiam
Greg
kefirek
Zobacz takie cos

  1. SELECT t1.*, t2.* FROM TABELA_A t1 LEFT JOIN TABELA_B t2 USING(user=user) ORDER BY jakas_nazwa
juzew
Dzieki, ale niestety to nie to.

Taka skladnia jaka podales wysypuje mi sie kompletnie ale to tylko przez maly detal. Zamiana USING (user=user) na USING (user) i jakas_nazwa na t1.jakas_nazwa spowodowalo, ze zapytanie sie wykonalo, ale podobny efekt juz udalo mi sie wczesniej uzyskac.

Problem polega na tym, zapytanie to zwraca wyniki wg zasady:
wszystkie rekordy z powiazanych tabel (tam gdzie user=user w tabelach)
+ wszystkie pozostale rekordy z tabeli A o ile nie maja one powiazanych rekordow w tabeli B.

To czego mi w wyniku caly czas brakuje to rowniez oddzielnie te rekordy z tabeli A ktore maja jakies powiazania z B.
Czyli gdybym na koncu tego zapytania dodal jeszcze WHERE t1.jakas_nazwa = 'aaaaaaaaa' to zwroci mi ono:

id_a | id_b | jakas_nazwa | user
2 | 1 | aaaaaaaaaaa | 1
2 | 3 | aaaaaaaaaaa | 2

ale nie zwroci rekordu podstawowego z tabeli A
2 | NULL | aaaaaaaaaa | 3

Kurcze moze cos z UNION da sie zrobic.
Czy mozna w jakis sposob posortowac w jednym zapytaniu (i wyciac przez LIMIT) wyniki 2 oddzielnych polaczonych przez UNION?

pozdrawiam

sorki ORDER BY t1.jakas_nazwa bylo na wyrost w moim wykonaniu - ORDER BY jakas_nazwa tez dziala - no ale niestety w sposob opisany powyzej - nie zwraca wszystkich potrzebnych wynikow...
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.