it-swarm.com.de

SQL Verbinden Sie drei Tabellen

Ich lerne nach und nach fortgeschrittene SQL-Abfragen und bin ziemlich überrascht mit einem Problem:

Ich habe drei Tabellen: news, author und images. Jedes Feld in der news-Tabelle (newsID) ist eine Nachrichtensendung, der dann ein Autor in der author-Tabelle (authorID) zugeordnet ist und in der images-Tabelle eine beliebige Anzahl von Bildern enthalten kann. Jedes Bild hat und ist assoziiert (newsID). Jede Geschichte hat also einen Autor, kann aber mehrere Bilder haben.

Ich möchte eine Liste aller Nachrichten erstellen und nur ein der Bilder als Miniaturbild verwenden. Das Problem ist, dass jede SQL-Abfrage, die ich versuche, die news-Elemente mit aufzulisten, Ergebnisse liefert, die der Anzahl der Bilder in der images-Tabelle und nicht der Anzahl der news-Elemente entsprechen.

Ich weiß nicht, wohin ich gehen soll. Jede Hilfe wäre sehr dankbar.

14

Wenn die drei betreffenden Tabellen [news], [author] und [image] mit entsprechenden Spalten sind, dann 

Abgeleiteter Tabellenansatz

sie können über eine abgeleitete Abbildtabelle verfügen, um ein Bild pro News zu erhalten, und fügen Sie es wie gezeigt mit der Tabelle news und author zusammen .. Diese wurde in SQL Server geschrieben und getestet.

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

Sie können die LEFT OUTER JOINs durch INNER JOINs ersetzen, wenn Sie keine Nachrichten ohne Bilder benötigen.

Correlated Subquery-Ansatz (wie von Marcelo Cantos vorgeschlagen)

Wenn imageData als Text oder Bild gespeichert wird, funktioniert der MAX in der abgeleiteten Tabelle nicht. In diesem Fall können Sie eine korrelierte Unterabfrage wie folgt verwenden:

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

22
Kash

Eine Option ist das folgende Prädikat hinzufügen:

FROM news JOIN images ...
...
WHERE imageID = (SELECT MAX(imageID)
                   FROM image
                  WHERE newsID = news.newsID)

Beachten Sie, dass dies Nachrichten ohne Bild ausschließt. Wenn Sie dies nicht möchten, benötigen Sie einen linken Join für Bilder und eine zusätzliche Bedingung für das WHERE:

FROM news LEFT JOIN images ...
...
WHERE imageID IS NULL
   OR imageID = (SELECT MAX(imageID)
                   FROM image
                  WHERE newsID = news.newsID)
2
Marcelo Cantos

Sie können die Reihenfolge auf der Unterauswahl ändern, um 1 Bild pro Nachrichtenzeile zu erhalten, nach der Sie suchen ...

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 --??
)
0
dotjoe

Wenn Sie 3 Tabelle in MySQL haben, und Sie wollen es zusammenfügen. Zum Beispiel habe ich 3 Tabelle 1 Schüler 2 Fach 3 Partitur Jetzt möchten Sie dem Schüler mit Fach und Partitur beitreten. so wir Ihnen diese Syntax: Wählen Sie * aus Schülerinnen Join Subjekt Inner Join Score;

0
user2147772