SQL: Statement zu zeigen, 1 Kind Datensatz pro Elternteil in einer Eins-zu-Viele-Beziehung
-
23-08-2019 - |
Frage
Ich habe 2 Tabellen, eine Produkttabelle und ein Bild Tabelle. Die Produkte können mehr als 1 Bild pro Datensatz haben. Ich brauche eine SQL-Anweisung, die ein Bild pro Produkt auflistet, anstatt alle Bilder pro Produkt.
Ein abgespeckte Beispiel meiner aktuellen Bemühungen ist:
SELECT Product.RefCode, Img.ImgPath
FROM Product INNER JOIN (
SELECT ProductImg.ImgPath, ProductImg.PrdFK
FROM ProductImg
LIMIT 0,1) AS Img ON Product.PrdID = Img.PrdFK;
Das obige Beispiel gibt 0 Ergebnisse, aber wenn ich das LIMIT 0,1 aus dem Sub entfernen SELECT ich eine komplette Liste aller Produkte erhalten und alle Bilder.
Ich will nur 1 Bild Datensatz pro Produkt Datensatz zurückgegeben werden.
Ich habe überarbeitet „Programmierer“ Code zu MySQL und es funktioniert gut.
SELECT Product.RefCode,
(Select ProductImg.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products
Aus irgendeinem Grund, wenn „Bill Karwin die“ Lösung versucht, es geschickt, um den Server Laden für eine lange Zeit.
Lösung
Dies sollte funktionieren:
SELECT Product.RefCode,
(Select Img.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) As ImgPath
FROM Product
Wenn Sie einen Weg, um zu bestimmen, welches Bild die Auswahl Rückkehr, dann können Sie ein, wo hinzufügen und vielleicht eine ORDER BY in der Unter wählen.
Im folgenden Beispiel werden wir nur die letzte der aktiven Bilder erhalten.
SELECT Product.RefCode,
(Select Img.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK
And IsActive = 1
Order By EntryDate Desc LIMIT 0,1) As ImgPath
FROM Product
Herausgegeben und korrigiert 'Top 1' auf 'Grenzwert 0,1'.
Andere Tipps
MySQL hat hier eine gewisse Flexibilität. Sie können GROUP BY verwenden das Ergebnis einer Zeile pro Produkt zu beschränken, und dann wird MySQL wählen, welche willkürlich Bild. In der Praxis neigt es um das Bild zu sein, die physikalisch erst in der Datenbank gespeichert ist, aber Sie haben keine Kontrolle über die.
SELECT p.RefCode, i.ImgPath
FROM Product p INNER JOIN ProductImg i
ON (p.PrdID = i.PrdFK)
GROUP BY p.PrdID;
Wenn Sie 1 spezifisches Bild pro Produkt gibt es Möglichkeiten, das auch zu tun. Sie müssen sich, dass in Ihren Anforderungen umfassen. : -)
Wenn Sie eine ID-Spalte auf dem Bild Tabelle haben, sollte diese Arbeit (egal, was das SQL-Produkt oder Version) -
SELECT p.RefCode, i1.ImgPath FROM Product p INNER JOIN ProductImg i1 ON p.PrdId = i1.PrdFk LEFT JOIN ProductImg i2 ON i1.PrdId = i2.PrdId AND i1.ImgId < i2.ImgId WHERE i2.ImgId IS NULL
Was Sie brauchen, ist eine Flagge auf dem Bild Tabelle angeben, ob es das Hauptbild angezeigt werden soll. Es gibt Möglichkeiten, ein beliebiges Bild ziehen, aber ich denke, es wäre besser, um sicherzustellen, dass Sie das richtige Bild ziehen.