Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jeden-do-wielu i jeden reprezentant z "wielu"
Forum PHP.pl > Forum > Bazy danych
erix
Jak wygląda relacja jeden-do-wielu, to pewnie większość wie, możliwe że się mój problem już przewinął, ale po poszukiwaniach nie znalazłem innych rozwiązań niż te, które zdążyły się już osadzić w mojej mózgownicy.

Mianowicie, szukam sposobu na wyciągnięcie reprezentanta z tabeli będącej częścią "wielu" z nazwy relacji, np. tabela mieszkania i tabela mieszkańcy. Potrzebuję wyciągnąć listę wszystkich mieszkań wraz z dokładnie jednym mieszkańcem, który w nim rezyduje.

No i znane mi są dwie możliwości:
  • GROUP BY po ID mieszkania (co raczej wydajne nie będzie)
  • podzapytanie


moje pytanie: są inne opcje niż powyższe?
cojack
Jeżeli w tabeli łączącej mieszkańców z mieszkaniami, miałbyś kolumnę z informacją o tym czy dany mieszkaniec jest właścicielem mieszkania, to wystarczyła by taka informacja w klauzuli ON ( ... ) i pobrało by tylko jednego mieszkańca z każdego mieszkania dla każdego mieszkania. Albo próbuj jakąś daną z tabeli mieszkańców, pobrać która jest unikatowa dla poszczególnych mieszkańców danego mieszkania.

@edit
ciężko tak na sucho jak nie znasz reprezentacji tabel.
erix
Ale to przykładowo tylko, załóżmy:

mieszkania
Kod
+----+-------+
| ID | nazwa |
+----+-------+
|  4 | asd   |
|  5 | sda   |
|  6 | xyz   |
+----+-------+
3 rows in set (0.00 sec)

mieszkańcy;
Kod
+----+------------+----------+
| ID | mieszkanie | nazwisko |
+----+------------+----------+
|  1 |          4 | fgdfg    |
|  2 |          4 | xyyy     |
|  3 |          5 | werwer   |
|  4 |          5 | dsfgdfg  |
|  5 |          6 | ffff     |
+----+------------+----------+
5 rows in set (0.00 sec)


zwykły join
Kod
+----+-------+----+------------+----------+
| ID | nazwa | ID | mieszkanie | nazwisko |
+----+-------+----+------------+----------+
|  4 | asd   |  1 |          4 | fgdfg    |
|  4 | asd   |  2 |          4 | xyyy     |
|  5 | sda   |  3 |          5 | werwer   |
|  5 | sda   |  4 |          5 | dsfgdfg  |
|  6 | xyz   |  5 |          6 | ffff     |
+----+-------+----+------------+----------+
5 rows in set (0.00 sec)


i z pogrupowaniem:
Kod
+----+-------+----+------------+----------+
| ID | nazwa | ID | mieszkanie | nazwisko |
+----+-------+----+------------+----------+
|  4 | asd   |  1 |          4 | fgdfg    |
|  5 | sda   |  3 |          5 | werwer   |
|  6 | xyz   |  5 |          6 | ffff     |
+----+-------+----+------------+----------+
3 rows in set (0.04 sec)


Chodzi mi o ten z pogrupowaniem (ale tylko pod względem działania). winksmiley.jpg
cojack
  1. CREATE TABLE "mieszkancyMieszkania" (
  2. "idMieszkanca" INT REFERENCES "mieszkancy" NOT NULL,
  3. "idMieszkania" INT REFERENCES "mieszkania" NOT NULL,
  4. "wlasciciel" BOOLEAN DEFAULT FALSE NOT NULL,
  5. PRIMARY KEY( "idMieszkanca", "idMieszkania" )
  6. );
  7.  
  8. SELECT
  9. ...
  10. LEFT JOIN
  11. "mieszkancyMieszkania"
  12. ON
  13. ( "mieszkancyMieszkania" = ... AND "mieszkancyMieszkania"."wlasciciel" )
  14. ...;



@edit a nie kufa, fail sory to jest m-to-m czekaj bo mnie tu w pracy goni czas..

@edit2
no przecież tu zwykły DISTINCT poleci. Ale mi namieszałeś w berecie.
erix
No tak, ale chcę uniknąć tworzenia osobnej kolumny. Nieistotne jest, którego mieszkańca wybierze. Też wpadłem na coś takiego, ale zależy mi na rozwiązaniu, które działa jak GROUP BY, ale przy napotkaniu pasującego rekordu przejdzie do następnego dopasowania źródłowego, a nie katuje pomimo to, że ma już co trzeba...
zegarek84
HAVING...
erix
  1. DISTINCT

skleroza nie boli, a ja kombinowałem... dry.gif

~zegarek84, ale to wciąż wymaga użycia group by.
zegarek84
Cytat(erix @ 12.08.2010, 13:58:52 ) *
...Potrzebuję wyciągnąć listę wszystkich mieszkań wraz z dokładnie jednym mieszkańcem, który w nim rezyduje.
Więc ja źle zrozumiałem o co chodziło winksmiley.jpg
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.