2016-10-24 1 views
1

Il existe peu de tables pour stocker le contenu et les catégories. Le contenu et les catégories sont mappés dans de nombreuses relations.Requête Mysql Crostab

Une catégorie peut avoir plusieurs contenus.

Un contenu peut être inclus dans plusieurs catégories.

J'ai donc créé la table content_cat_xref pour mapper ces tables.

catégorie Table - id, nom, etc

tableau contenu - id, nom, type_code (read_it, play_it, prove_it, watch_it)

content_cat_xref - content_id, category_id, etc

Je voulais pour afficher les catégories avec les types de contenu et le nombre de contenus pour chaque type de contenu, comme suit.

enter image description here

Mais je me comme suit.

enter image description here

Ma requête est la suivante

select 
ccx.category_id, 
IF(count(c.id) > 0, "True", "False") as Sections_with_content, 
(CASE WHEN (c.type_code = 'READ_IT') THEN count(c.id) ELSE 0 END) as "READ_IT", 
(CASE WHEN (c.type_code = 'WATCH_IT') THEN count(c.id) ELSE 0 END) as "WATCH_IT", 
(CASE WHEN (c.type_code = 'PLAY_IT') THEN count(c.id) ELSE 0 END) as "PLAY_IT", 
(CASE WHEN (c.type_code = 'PROVE_IT') THEN count(c.id) ELSE 0 END) as "PROVE_IT", 
count(c.id) 
    from content_cat_xref as ccx left outer join content as c 
    on ccx.content_id = c.id 
    group by ccx.category_id, c.type_code 

Si quelqu'un a ce genre d'expérience sera utile pour moi de résoudre le problème.

Répondre

1

Ne pas regrouper par c.type_code car les différents types doivent être regroupés dans des enregistrements distincts. Le point entier des comptes conditionnels est de travailler sur l'ensemble du groupe global (dans ce cas, category_id) et de renvoyer uniquement les comptes pertinents.

MISE À JOUR

Vous devez également changer la façon dont vous faites les comptes conditionnels. La condition doit être dans la fonction count() (ou sum()), pas en dehors de celle-ci, puisque vous voulez que les résultats s'affichent dans tous les cas. Ainsi, au lieu de

(CASE WHEN (c.type_code = 'READ_IT') THEN count(c.id) ELSE 0 END) as "READ_IT" 

ont

COUNT(CASE WHEN (c.type_code = 'READ_IT') THEN 1 ELSE NULL END) as "READ_IT" 

Explication: L'instruction case renvoie la valeur 1 si la condition est assortie, et le retour null si ce n'est pas. La fonction Count() compte toutes les valeurs non nulles. Changez l'expression de tous les autres champs en fonction de l'exemple ci-dessus.

+0

Merci pour le commentaire. Ensuite, il affichera le nombre total sous le code de type incorrect. Pouvez-vous m'aider s'il vous plaît à récupérer le compte pertinent dans ce cas? – cha

+0

Je suis désolé, mais je ne comprends pas votre question de suivi. – Shadow

+0

Hmm, je pense que je l'ai eu, je vais mettre à jour ma réponse dans une minute. – Shadow