SQL объединяет три таблицы - PullRequest
14 голосов
/ 05 ноября 2011

Я изучаю сложные запросы SQL понемногу, и у меня возникла довольно тупая проблема:

У меня есть три таблицы: news, author и images.Каждое поле в таблице news (newsID) является новостью, которая затем имеет ассоциированного автора в таблице author (authorID) и может иметь любое количество изображений, связанных в таблице images.Каждое изображение имеет и связано (newsID).Таким образом, каждая история имеет одного автора, но может иметь несколько изображений.

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

Надеюсьне знаю, куда идти отсюда.Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

22 голосов
/ 05 ноября 2011

Если речь идет о 3 таблицах [ news ], [ author ] и [ image ] с соответствующими столбцами, тогда

Подход к производной таблице

вы можете иметь производную таблицу изображений, чтобы получать одно изображение на новости, а затем объединить ее с таблицей news и author как показано.Это было написано и протестировано на 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

Вы можете заменить ЛЕВЫЕ ВНЕШНИЕ СОЕДИНЕНИЯ на ВНУТРЕННИЕ СОЕДИНЕНИЯ, если вам не нужны новости без изображений.

Коррелированный подзапросподход (как предложено Марсело Кантосом)

Если 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 голосов
/ 05 ноября 2011

Один из вариантов - добавить следующий предикат:

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)
0 голосов
/ 08 марта 2013

Если у вас есть 3 таблицы в MySQL и вы хотите объединить их вместе. например у меня 3 таблицы 1 студент 2 предмета 3 балла Теперь хочу присоединиться к студенту с предметом и баллом. поэтому мы вам этот синтаксис: выберите * из оценки внутреннего присоединения ученика;

0 голосов
/ 05 ноября 2011

Вы можете изменить порядок с помощью подвыбора, чтобы получить 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 --??
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...