2009-05-22 5 views
2

J'ai 2 tables, une table de produits et une table d'images. Les produits peuvent avoir plus d'une image par enregistrement. J'ai besoin d'une instruction SQL qui listera 1 image par produit plutôt que toutes les images par produit.SQL: Instruction pour afficher 1 enregistrement enfant par parent dans une relation un-à-plusieurs

A revus à la baisse par exemple de mon effort actuel:

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; 

L'exemple ci-dessus renvoie 0, cependant, si je retire la LIMITE 0,1 de la Sous SELECT j'obtenir une liste complète de tous les produits et toutes les images.

Je veux juste 1 enregistrement d'image par enregistrement de produit à retourner. J'ai corrigé le code «un programmeur» vers MySQL et cela fonctionne très bien.

SELECT Product.RefCode, 
     (Select ProductImg.ImgPath 
     From ProductImg 
     Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath 
FROM Products 

Pour une raison quelconque, en essayant la solution de "Bill Karwin", le serveur a été chargé pendant longtemps.

Répondre

1

Cela devrait fonctionner:

SELECT Product.RefCode, 
     (Select Img.ImgPath 
     From ProductImg 
     Where Product.PrdID = Img.PrdFK LIMIT 0,1) As ImgPath 
FROM Product 

Si vous avez un moyen de déterminer quelle image doit le retour de sélection, vous pouvez ajouter un où et peut-être un ordre par la sous-sélection.

Dans l'exemple suivant, nous obtiendrons uniquement les dernières images actives. Editer et corriger "Top 1" à "Limite 0,1".

+0

Le mot clé TOP est la propriété de Microsoft SQL Server (et de Sybase). –

+0

Désolé, je ne le savais pas. Merci beaucoup. –

+0

J'ai fait une petite révision (voir ci-dessus) mais la déclaration a bien fonctionné, merci. – ticallian

0

MySQL a une certaine flexibilité ici. Vous pouvez utiliser GROUP BY pour limiter le résultat à une ligne par produit, puis MySQL choisira arbitrairement quelle image. En pratique, il s'agit généralement de l'image stockée physiquement en premier dans la base de données, mais vous n'avez aucun contrôle sur celle-ci.

SELECT p.RefCode, i.ImgPath 
FROM Product p INNER JOIN ProductImg i 
    ON (p.PrdID = i.PrdFK) 
GROUP BY p.PrdID; 

Si vous voulez 1 image spécifique par produit, il existe des moyens de le faire aussi. Vous devez inclure cela dans vos exigences. :-)

0

Si vous avez une colonne d'identité sur la table d'image, cela devrait fonctionner (quel que soit le produit SQL ou 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 
0

Qu'est-ce que vous besoin est un drapeau sur la table Image pour spécifier si c'est l'image principale à afficher. Il existe des moyens de tirer une image arbitraire, mais je pense qu'il serait préférable de vous assurer que vous tirez l'image correcte.