2013-03-25 4 views
84

Я прочитал много потоков о получении только первой строки левого соединения, но по какой-то причине это не работает для меня.LEFT JOIN только первая строка

Вот моя структура (упрощенный конечно)

Ленты

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

Художники

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

feeds_artists

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

Теперь я хочу, чтобы получить статьи и присоединиться только первый артист, и я думал, что-то вроде этого:

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' 

просто получить только первую строку из feeds_artists, но уже это не работает ,

Я не могу использовать TOP из-за моей базе данных, и я не могу групповые результаты по feeds_artists.artist_id, как мне нужно, чтобы отсортировать их по дате (я получил результаты, группируя их таким образом, но результаты которых не новейший)

Пробовал что-то с ВНЕШНИМ ПРИМЕНЕНИЕМ, а также не удался. Честно говоря, я не могу себе представить, что происходит в этих рядах - возможно, самая большая причина, почему я не могу заставить это работать.

РЕШЕНИЕ:

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

здесь решения https://stackoverflow.com/a/7588442/612987 –

ответ

68

Если вы можете предположить, что художник ИД приращение во времени, то MIN(artist_id) будет в ближайшее время.

Так попробовать что-то вроде этого (непроверенные ...)

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

Спасибо за ваш быстрый ответ. Это был не точный ответ, но я полностью понял меня.Я всегда старался объединиться и на одном уровне, а не с тем, чтобы один зависел от другого. Большое вам спасибо за то, что вы на правильном пути. Отредактировано первое сообщение – KddC

+0

@KddC вместо изменения вопроса, чтобы добавить ответ, отредактируйте этот ответ или сделайте свой собственный ответ. – PhoneixS

+3

На данный момент не было бы простого подзапроса лучше? Потому что теперь у вас есть соединение и подзапрос. Просто спрашиваю, потому что я ищу решение одной и той же проблемы :) – galdikas

46

версии без подвыборки:

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

Я думаю, что это должен быть принятый ответ – Binod

+2

Я не думаю, что это будет первая строка (первый id или первый из чего-то другого), она просто случайно выбирает одну из левых строк объединения. – Sinux

+15

Этот запрос неверен. Он выберет «наименьшее» имя исполнителя, а не имя первых художников в наборе. – Glapa

3

версии без подвыборки, присоединяемый только первый автор:

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

У этой проблемы есть проблема, как ответ Дениса - вы получите случайную строку, а не первую. – Ether

+0

@Ether Нет, у него нет той же проблемы. У меня есть «ИДЕТ» в конце. – Glapa

+2

@Glapa, но 'HAVING' применяется после' GROUP BY', когда 'feeds_artists' уже агрегируется. –

0

Я использовал что-то еще (думаю, лучше ...) и хочу поделиться им:

Я создал мнение, что имеет «группы» пункт

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code 

SELECT * FROM client INNER JOIN vCountries on client_province = province_id 

Я хочу сказать еще, что я думаю, что нам нужно сделать, это решение потому что мы сделали что-то неправильно В АНАЛИЗЕ ... по крайней мере, в моем случае ... но иногда это дешевле сделать это, чтобы переделать все ...

Надеюсь, это поможет!

Смежные вопросы