1
votes

Comment sélectionner une valeur unique parmi plusieurs à plusieurs relations mysql

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 commentaires

Quelle version de MySQL?


Ah oui désolé, j'ai oublié de mentionner ça. J'utilise mysql Ver 15.1 Distrib 10.2.31-MariaDB


Je 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


3 Réponses :


1
votes

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


0 commentaires

1
votes

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

Démo sur dbfiddle


1 commentaires

J'ai essayé cela et cela me donne ce que je recherche. Merci pour votre aide homme: D



0
votes

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


0 commentaires