J'ai une requête quelque chose comme i fonctionne bien pour moi tant que chaque produit a été attribué à une seule catégorie. Mais si un produit est attribué à de nombreuses catégories, il renvoie toutes les combinaisons possibles. P> Puis-je seulement sélectionner le premier et si un produit n'a pas de catégorie, le lien doit toujours être renvoyé avec catégorie_id = null < / p> p>
3 Réponses :
Vous pouvez utiliser un groupe par pour y accomplir avec un Fonction globale , probablement min ou max .
Selon la catégorie ID que vous préférez dans votre résultat, vous pouvez sélectionner le minimum. P>
SELECT S.product_id, S.link, MAX(C.id) AS category_id FROM Products P INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 LEFT OUTER JOIN Categories C ON c.product_id = P.id WHERE P.active = 1 GROUP BY S.product_id, S.link
Cela ne retournerait-il pas plusieurs rangées? La fonction max / min est appliquée sur le jeu de résultats, il ne filtre pas les lignes de la série de résultats ...
@Justinrowe the groupe par code> vous limite à une ligne par
product_id code> et
lien code> combinaison.
Solution alternative à l'aide de sous-requête:
SELECT S.product_id, S.link, ( SELECT C.id FROM Categories C WHERE C.product_id = P.id AND ROW_NUMBER() OVER(ORDER BY /* your sort option goes here*/ ) = 1 ) AS category_id FROM Products P INNER JOIN SEO S ON S.product_id = P.id AND P.product_type = 1 WHERE P.active = 1
Un moyen facile est d'utiliser des applications extérieures, de manière à avoir une jointure corrélée et de faire une première requête. Ainsi, vous êtes capable d'accéder à toutes les colonnes de l'enregistrement de catégorie en question. J'ajoute un nom de catégorie ici comme exemple:
En utilisant une application extérieure, il est également possible de commander par n'importe quelle colonne de la table de catégorie qui est probablement ce dont il a besoin.
le premier code>, en fonction de quels critères?
Vous pouvez ajouter un min ou max et un groupe par catégorie_id. Si cela ne suffit pas, déplacez les catégories dans une sous-requête.