SQL: Statement zu zeigen, 1 Kind Datensatz pro Elternteil in einer Eins-zu-Viele-Beziehung

StackOverflow https://stackoverflow.com/questions/896561

  •  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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top