Base de données: MS SQL 2008
SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, Pictures.Picture, Listing.ID
FROM Listing INNER JOIN Pictures ON Listing.ID = Pictures.ListingID
WHERE (Pictures.ID = (SELECT MIN(ID) FROM Pictures WHERE (ListingID = Listing.ID)))
Le problème est que j'ai plusieurs "listes" sans image, et à cause de ce script SQL, elles n'apparaissent pas. Comment puis-je les faire apparaître?
Peut-être donner à la colonne Pictures.Picture une valeur de "default.jpg" si la valeur est nulle? Je suis assez perdu là-dessus, donc si quelqu'un pouvait aider, ce serait incroyable. Désolé si je pose mal la question également, je ne comprends pas comment demander vraiment ce dont j'ai besoin. Mais demandez plus de détails et je les posterai.
Chaque annonce peut avoir autant d'images que l'utilisateur le souhaite, j'ai besoin de ce script pour afficher une annonce même si elle n'a pas d'image.
PHASE 2
Merci à tous. Jusqu'à présent, j'apprends de nouvelles commandes dont je ne savais même pas qu'elles existaient. Le problème est maintenant de renvoyer une ligne pour chaque image d'une annonce. Mais l'image par défaut fonctionne très bien.
SELECT Listing.Title, Listing.MLS, coalesce(Pictures.PictureTH, '../default_th.jpg') as PictureTH, coalesce(Pictures.Picture, '../default.jpg') as Picture, Listing.ID FROM Listing LEFT
OUTER JOIN Pictures ON Listing.ID = Pictures.ListingID
Comment puis-je l'obtenir pour qu'il ne renvoie qu'une ligne par ListingID?
Deux choses:
left outer join
au lieu de inner join
pour obtenir toutes les annonces, même avec des images manquantes.Utilisez coalesce
pour appliquer la valeur par défaut
SELECT Listing.Title
, Listing.MLS
, Pictures.PictureTH
, coalesce(Pictures.Picture, 'default.jpg') as Picture
, Listing.ID
FROM Listing
LEFT OUTER JOIN Pictures
ON Listing.ID = Pictures.ListingID
MODIFIER Pour limiter à une ligne:
SELECT Listing.Title
, Listing.MLS
, Pictures.PictureTH
, coalesce(Pictures.Picture, 'default.jpg') as Picture
, Listing.ID
FROM Listing
LEFT OUTER JOIN Pictures
ON Listing.ID = Pictures.ListingID
WHERE Pictures.ID is null
OR Pictures.ID = (SELECT MIN(ID)
FROM Pictures
WHERE (ListingID = Listing.ID)))
si vous souhaitez définir la valeur par défaut si le pic est nul, vous pouvez le faire via la clé COALESCE Word:
SELECT Listing.Title, Listing.MLS, Pictures.PictureTH,
COALESCE (Pictures.Picture, 'default.jpg') AS Pictures, Listing.ID
FROM Listing LEFT JOIN Pictures
ON Listing.ID = Pictures.ListingID
WHERE (Pictures.ID = (SELECT MIN(ID)
FROM Pictures WHERE (ListingID = Listing.ID)))
Vous pouvez également y parvenir via IsNull comme ci-dessous:
SELECT Listing.Title, Listing.MLS, Pictures.PictureTH,
ISNULL(Pictures.Picture, 'default.jpg') AS Pictures, Listing.ID
FROM Listing LEFT JOIN Pictures
ON Listing.ID = Pictures.ListingID
WHERE (Pictures.ID = (SELECT MIN(ID)
FROM Pictures WHERE (ListingID = Listing.ID)))
vous pouvez lire ici sur IsNull et Coalesce
Utilisez left outer join
Au lieu de inner join
Inner join
Renverra des résultats si et seulement s'il y a un résultat qui satisfait la jointure.
Left outer join
Renverra les résultats de la table latérale gauche, et si la jointure est satisfaite, ajoutez également les résultats de la table latérale droite ..
Si vous devez convertir les valeurs nulles renvoyées par les jointures non satisfaisantes, utilisez la fonction coalesce
comme coalesce(Pictures.Picture, 'default.jpg')
Besoin de faire une jointure GAUCHE
SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, Pictures.Picture, Listing.ID
FROM Listing LEFT JOIN Pictures ON Listing.ID = Pictures.ListingID
Landmine, quelle base de données utilisez-vous?
Si c'est SQL Server 2005 ou supérieur ou Oracle, vous pouvez utiliser la commande pivot pour y parvenir.