Я читал много тем о том, как получить только первый ряд левого соединения, но по какой-то причине это не работает для меня.
Вот моя структура (конечно, упрощенная)
Ленты
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
как мне нужно отсортировать их по дате (я получил результаты, сгруппировав их таким образом, но результаты не самые новые)
Пробовал кое-что с OUTER APPLY, но безуспешно. Честно говоря, я не могу себе представить, что происходит в этих строках - наверное, самая главная причина, почему я не могу заставить это работать.
РЕШЕНИЕ:
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'
Ответы:
Если вы можете предположить, что идентификаторы исполнителей со временем увеличиваются, то это
MIN(artist_id)
будет самый ранний.Так что попробуйте что-нибудь вроде этого (непроверено ...)
источник
Версия без подвыбора:
источник
Ответ @Matt Dodges поставил меня на правильный путь. Еще раз спасибо за ответы, которые помогли многим ребятам. Это работает так:
источник
f.id
условия.Я использовал кое-что еще (думаю, лучше ...) и хочу этим поделиться:
Я создал ПРОСМОТР, в котором есть предложение "группа"
Я хочу сказать еще, что я думаю, что мы должны сделать это решение, ПОТОМУ ЧТО МЫ ЧТО-ТО НЕПРАВИЛЬНО ПРИ АНАЛИЗЕ ... по крайней мере, в моем случае ... но иногда это дешевле сделать, чтобы перепроектировать все ...
Я надеюсь, что это помогает!
источник
country_code
,GROUP BY
Это неправильно. СмONLY_FULL_GROUP_BY
.WITH x AS (
предложение?Основываясь на нескольких ответах здесь, я нашел то, что сработало для меня, и я хотел обобщить и объяснить, что происходит.
перерабатывать:
чтобы:
условие, которое связывает t1 и t2, перемещается из
ON
и во внутренний запросWHERE
.MIN(primary key)
илиLIMIT 1
гарантируют , что только одна строка возвращается внутренним запросом.после выбора одной конкретной строки нам нужно указать,
ON
какая это строка. вот почемуON
сравнивается первичный ключ объединенной таблицы.вы можете поиграть с внутренним запросом (то есть порядком + лимитом), но он должен возвращать один первичный ключ желаемой строки, который укажет
ON
точную строку для присоединения.источник
LIMIT
или толькоMIN
.ON
условие должно быть на присоединяемой таблицы первичного ключа для снижения производительности избежать.Я хочу дать более общий ответ . Тот, который будет обрабатывать любой случай, когда вы хотите выбрать только первый элемент в LEFT JOIN .
Вы можете использовать подзапрос, который GROUP_CONCATS, что вы хотите (отсортированный тоже!), А затем просто разделить результат GROUP_CONCAT и взять только его первый элемент, например так ...
Поскольку у нас есть DESC в качестве опции ORDER BY , это вернет идентификатор человека для кого-то вроде "Zack". Если бы мы хотели кого-то с таким именем, как «Энди», мы бы изменили ORDER BY FirstName DESC на ORDER BY FirstName ASC .
Это ловко, так как это дает возможность упорядочения полностью в ваших руках. Но после большого тестирования он не будет хорошо масштабироваться в ситуации с большим количеством пользователей и большим количеством данных.
Это, однако, полезно при запуске отчетов с интенсивным использованием данных для администратора.
источник
GROUP_CONCAT
Трюк хорошо до тех пор , как число значений ограничено. Ограничение по умолчанию - 1024 символа.