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 балла теперь хочу присоединиться к ученику с предметом и счетом. поэтому мы вам этот синтаксис: выберите * из внутреннего внутреннего субъекта со студента,