2013-03-25 18 views
84

Przeczytałem wiele wątków dotyczących uzyskania tylko pierwszego rzędu lewego łączenia, ale z jakiegoś powodu nie działa to dla mnie.LEFT JOIN tylko pierwszy wiersz

Oto moja konstrukcja (uproszczony oczywiście)

Kanały

id | title | content 
---------------------- 
1 | Feed 1 | ... 

Artyści

artist_id | artist_name 
----------------------- 
1   | Artist 1 
2   | Artist 2 

feeds_artists

rel_id | artist_id | feed_id 
---------------------------- 
1  |  1  | 1 
2  |  2  | 1 
... 

Teraz chcę uzyskać artykuły i dołącz tylko pierwszy artysta i myślałem o czymś takim:

SELECT * 
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
     SELECT feeds_artists.feed_id FROM feeds_artists 
     WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1 
    ) 
WHERE feeds.id = '13815' 

tylko po to żeby tylko pierwszy wiersz feeds_artists, ale już to nie działa .

nie mogę używać TOP powodu mojej bazy danych i nie mogę grupowych wyniki według feeds_artists.artist_id jak trzeba sortować je według daty (mam wyniki, grupując je w ten sposób, ale wyniki, gdzie nie najnowszy)

Próbowałem czegoś z ZASTOSOWANIEM ZEWNĘTRZNEGO - również bez powodzenia. Szczerze mówiąc, nie mogę sobie wyobrazić, co dzieje się w tych rzędach - prawdopodobnie największy powód, dla którego nie mogę tego zrobić.

ROZWIĄZANIE:

SELECT * 
FROM feeds f 
LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id 
    LIMIT 1 
) 
WHERE f.id = '13815' 
+0

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – Sinux

+0

tutaj jest rozwiązanie https://stackoverflow.com/a/7588442/612987 –

Odpowiedz

68

Jeśli można założyć, że artystę identyfikatory przyrost w czasie, wówczas MIN(artist_id) będzie najwcześniej.

Więc spróbuj coś takiego (niesprawdzone ...)

SELECT * 
    FROM feeds f 
    LEFT JOIN artists a ON a.artist_id = (
    SELECT 
     MIN(fa.artist_id) a_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.feed_id 
) a 
+0

Dzikujemy za szybko odpowiedź. To nie była dokładna odpowiedź, ale całkowicie doprowadziła mnie do właściwej drogi.Zawsze starałem się dołączyć do obu na tym samym poziomie, a nie do tego, który zależał od drugiego. Dziękuję bardzo za doprowadzenie mnie na właściwą drogę. Edytował pierwszy wpis – KddC

+0

@KddC zamiast modyfikować pytanie, aby dodać odpowiedź, edytować tę odpowiedź lub utworzyć własną odpowiedź. – PhoneixS

+3

Czy w tym momencie proste pod-zapytanie nie byłoby lepsze? Ponieważ teraz masz połączenie i pod-zapytanie. Po prostu prosząc o przyczynę szukam rozwiązania tego samego problemu :) – galdikas

46

Wersja bez podselekcji:

SELECT f.title, 
      f.content, 
      MIN(a.artist_name) artist_name 
    FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
+1

Myślę, że to powinna być przyjęta odpowiedź. – Binod

+2

Nie sądzę, że będzie to pierwszy wiersz (pierwszy identyfikator lub pierwszy z czegoś innego), to po prostu losowo wybierz jeden z lewej linii łączenia. – Sinux

+15

To zapytanie jest nieprawidłowe. Wybiera "najniższą" nazwę wykonawcy, a nie nazwiska pierwszych artystów w zestawie. – Glapa

3

wersja bez podselekcji że dołączy tylko pierwszy autor:

SELECT f.title, 
     f.content, 
     a.artist_name artist_name, 
     min(a.id) as m 
FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
HAVING a.id = m; 
+0

Ma to ten sam problem, co reakcja Denisa - dostaniesz losowy rząd, a nie pierwszy. – Ether

+0

@Ether Nie, nie ma tego samego problemu. Na końcu mam 'HAVING'. – Glapa

+2

@Glapa ale 'HAVING' jest stosowane po' GROUP BY', gdy 'feedsartki' jest już zagregowane. –

0

Użyłem czegoś innego (myślę, że lepiej ...) i chcę się nim podzielić:

utworzonego widoku, który ma „grupy” klauzuli

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code 

SELECT * FROM client INNER JOIN vCountries on client_province = province_id 

Chcę jeszcze powiedzieć, że myślę, że musimy zrobić to rozwiązanie, ponieważ zrobiliśmy coś źle w ANALIZY ... przynajmniej w moim przypadku ... ale czasami taniej jest to zrobić, aby przeprojektować wszystko ...

Mam nadzieję, że to pomoże!