Salut, je suis confus dans ce cas SQL. J'utilise mysql Ver 15.1 Distrib 10.2.31-MariaDB . Et disons que j'ai 3 tableaux produits , catégories et product_categories comme tableau croisé dynamique.
Voici l'exemple de données: p >
| product_id | category_id | -------------------------------- | 3 | 20 | | 4 | 20 |
Et pour les catégories:
| product_id | category_id | -------------------------------- | 1 | 20 | | 3 | 20 | | 4 | 20 |
Et pour le tableau croisé dynamique, product_categories:
SELECT * FROM product_categories WHERE product_id IN (1, 2, 3, 4) GROUP BY product_id HAVING category_id=20
3 Réponses :
Je suppose que vous voulez des valeurs maximales uniquement
SELECT product_id,MAX(category_id) as category_id FROM product_categories WHERE product_id IN (1, 2,
3, 4)
GROUP BY product_id
HAVING category_id=20
Vous pouvez utiliser un CTE pour générer une liste de catégories d'arrêt pour chaque produit, puis JOIN que dans les tableaux categories et product_categories pour compter le nombre total de produits et le nombre de produits arrêtés pour chaque catégorie:
category_id total_product stopped_product 20 4 2 22 2 1 23 1 1
Résultat (pour vos exemples de données)
WITH prods AS (
SELECT product_id, MAX(category_id) AS stop_cat
FROM product_categories
GROUP BY product_id
)
SELECT c.id AS category_id,
COUNT(DISTINCT pc.product_id) AS total_product,
SUM(c.id = p.stop_cat) AS stopped_product
FROM categories c
JOIN product_categories pc ON pc.category_id = c.id
JOIN prods p ON p.product_id = pc.product_id
GROUP BY c.id
J'ai essayé cela et cela me donne ce que je recherche. Merci pour votre aide homme: D
Vous trouverez ci-dessous le nombre et les identifiants de produits par catégorie:
SELECT c.name as categoryName, c.level, COUNT(pc.product_id) as productCount, GROUP_CONCAT(pc.product_id) as productIds FROM product_categories pc JOIN categories c ON c.id = pc.category_id WHERE 1 GROUP by c.id
Quelle version de MySQL?
Ah oui désolé, j'ai oublié de mentionner ça. J'utilise mysql
Ver 15.1 Distrib 10.2.31-MariaDBJe n'ai pas obtenu ce qui est stop_product, mais vous pouvez trouver le nombre de produits par catégorie par requête que j'ai publiée. Et si vous voulez dire stop_product = level, vous pouvez ajouter un champ supplémentaire dans select (c.level) et trouver que