SQL Присоединяйтесь к трем таблицам
Я изучаю расширенные SQL-запросы понемногу, и у меня проблемы с проблемой:
У меня есть три таблицы: news
, author
и images
. Каждое поле в таблице news
(newsID
) представляет собой новостной сюжет, который затем имеет ассоциированного автора в таблице author
(authorID
) и может иметь любое количество изображений, связанных в таблице images
. Каждое изображение имеет и связано (newsID
). Таким образом, каждая история имеет одного автора, но может иметь несколько изображений.
Я хочу составить список всех новостей и использовать только одно из изображений в виде миниатюры. Проблема в том, что любой запрос sql, который я пытаюсь перечислить в элементах news
, дает мне результаты, равные количеству изображений в таблице images
, а не количеству элементов news
.
Я не знаю, куда идти отсюда. Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Если три таблицы, о которых идет речь, это [новости], [автор] и [изображение] с соответствующими столбцами, то
Подход с производной таблицей
вы можете получить таблицу полученных изображений, чтобы получить одно изображение на новости, а затем присоединить его к новостям и таблице авторов, как показано.
Это было написано и протестировано в SQL Server.
SELECT
N.[newsStoryTitle]
,A.authorName
,I.imageData1
FROM [news] N
LEFT OUTER JOIN author A ON A.newsID = N.newsID
LEFT OUTER JOIN
(
SELECT newsID, MAX(imageData) AS imageData1 FROM [image]
GROUP BY newsID
) AS I ON I.newsID = N.newsID
ORDER BY N.newsID
Вы можете заменить LEFT OUTER JOINs INNER JOINs, если вам не нужны новости без каких-либо изображений.
Связанный подзапрос (как предложил Марсело Кантос)
Если imageData хранится как текст или изображение, то MAX в производной таблице не будет работать. В этом случае вы можете использовать коррелированный подзапрос следующим образом:
SELECT N.newsStoryTitle ,
A.authorName ,
I.imageData
FROM dbo.news N
INNER JOIN dbo.author A ON N.newsID = A.newsID
INNER JOIN dbo.image I ON N.newsID = I.newsID
WHERE imageID = ( SELECT MAX(imageID)
FROM dbo.image
WHERE newsID = N.newsID
)
ORDER BY n.newsID
![Database Diagram]()
Ответ 2
Один из вариантов - добавить следующий предикат:
FROM news JOIN images ...
...
WHERE imageID = (SELECT MAX(imageID)
FROM image
WHERE newsID = news.newsID)
Обратите внимание, что это исключает новости без изображения. Если вы этого не хотите, вам понадобится левое соединение на изображениях и дополнительное условие на WHERE:
FROM news LEFT JOIN images ...
...
WHERE imageID IS NULL
OR imageID = (SELECT MAX(imageID)
FROM image
WHERE newsID = news.newsID)
Ответ 3
Вы можете изменить порядок в подзаголовке, чтобы получить 1 изображение в строке новостей, которую вы ищете...
select
....
from news n
left outer join images i on i.imageID = (
select top 1 i2.imageID
from images i2
where i2.newsID = n.newsID
order by --??
)
Ответ 4
Если у вас 3 таблицы в mysql, и вы хотите объединить их. например, у меня 3 таблицы
1 студент
2 предмета
3 балла
теперь хочу присоединиться к ученику с предметом и счетом. поэтому мы вам этот синтаксис:
выберите * из внутреннего внутреннего субъекта со студента,