Слева присоединиться только к первой строке

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

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

для

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'

4 ответов


Если вы можете предположить, что идентификаторы исполнителя увеличиваются со временем, то 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

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

   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

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

Я создал представление с предложением "group"

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code

SELECT * FROM client INNER JOIN vCountries on client_province = province_id

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

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


Я хочу дать больше обобщенный ответ. Тот, который справится в любом случае, когда вы хотите выбрать только первый элемент в левом соединении.

вы можете использовать подзапрос, который GROUP_CONCATS, что вы хотите (сортируется тоже!), а затем просто разделить GROUP_CONCAT бы результат, и берут только первый пункт, вроде так...

LEFT JOIN Person ON Person.id = (
    SELECT SUBSTRING_INDEX(
        GROUP_CONCAT(FirstName ORDER BY FirstName DESC SEPARATOR "_" ), '_', 1)
    ) FROM Person
);

Так как у нас есть DESC в нашей ЗАКАЗАТЬ ПО опция, это вернет идентификатор человека для кого-то вроде "Зак." Если бы мы хотели кого-то с именем "Энди", мы бы изменили заказать по имени DESC to заказать по имени ASC.

это ловко, так как это помещает силу заказа полностью в ваших руках. Но, после долгих испытаний, он не будет шкалы в ситуации с большим количеством пользователей и большим объемом данных.

это, однако, полезно при запуске интенсивных отчетов для администратора.