2009-08-02 12 views
8

Mam sytuację, w której mam jedną tabelę tytułów (t1) i inną tabelę z wieloma linkami, które odnoszą się do tych tytułów (t2) w relacji jeden do wielu.MySQL Dołącz do składni dla jednego do wielu relacji

Potrzebuję pełnej listy tytułów zwróconych z flagą, która wskazuje, czy jest z nią powiązany konkretny link.

LEFT JOIN i Grupa By:

SELECT 
    t1.id 
    , t1.title 
    , t2.link_id AS refId 
FROM 
    t1 
    LEFT JOIN t2 
     ON (t1.id = t2.title_id) 
GROUP BY t1.id; 

Jest blisko, jak to daje mi albo pierwszy LINK_ID lub NULL w kolumnie refId.

Teraz, w jaki sposób ograniczyć wyniki, jeśli mam konkretny id_połączenia zamiast zezwalania na uruchamianie t2 przez cały zestaw danych?

Jeśli dodać do klauzuli WHERE, na przykład:

WHERE t2.link_id = 123 

mam tylko kilka rekordów, gdzie mecze LINK_ID ale nadal potrzebują pełnego zestawu tytułów zwrócony NULL w kolumnie refId chyba LINK_ID = 123.

nadzieję, że ktoś może pomóc

Odpowiedz

13

Zamiast w klauzuli WHERE, umieścić swoje kryteria w klauzuli LEFT JOIN:

SELECT 
    t1.id 
    , t1.title 
    , t2.link_id AS refId 
FROM 
    t1 
    LEFT JOIN t2 
     ON t1.id = t2.title_id AND t2.link_id = 123 
GROUP BY t1.id; 
+0

Dziękuję zarówno za to. Działa świetnie. :) – Das123

4

Umieścić go w stanie przystąpić do drugiej tabeli

SELECT t1.id, t1.title, t2.link_id as refId 
FROM t1 
LEFT JOIN t2 ON t1 = t2.title_id AND t2.link_id = 123 
GROUP BY t1.id; 
+0

Nie powinno to być: 'ON t1.id = t2.title_id'? Czy też automatycznie bierze pk przy określaniu tabeli? –

Powiązane problemy