2011-09-21 6 views
0

J'ai un problème avec la comparaison d'une chaîne à des colonnes entières de tables différentes dans la base de données. Avoir une base de données avec deux tables en tant que catégories et le contenumysql Requête SQL pour comparer un entier et une chaîne

Maintenant, chaque texte de contenu peut appartenir à plusieurs catégories répertoriées dans la colonne category_ids de la table de contenu, séparées par une virgule. Je sais que ce n'est pas normalisé. Mais c'est déjà là.

catégories Table

id | name | timestamp 
1 aaa something 
2 bbb something 
3 ccc something 
4 ddd something 
5 eee something 

table de contenu

id | category_ids | content | timestamp 
1  1    xxx  something 
2  1,2,3,4  yyy  something 
3  1,2   zzz  something 
4  1,2,3   www  something 

Maintenant, je dois montrer la liste des catégories avec le nombre de texte contenu dans chaque catégorie. Indique le nombre de texte de contenu utilisant cette catégorie. Note (catégorie eee est pas là dans aucun texte de contenu montrant ainsi 0 nombre dans le jeu de résultats.)

aaa(4) 
bbb(3) 
ccc(2) 
ddd(1) 
eee(0) 

j'ai essayé beaucoup de façons de comparer les id de table catégories à category_ids du tableau contenu. Mais l'un est entier et l'autre est une chaîne.

une façon j'ai essayé est jeté fonction, mais a échoué

SELECT C.id , C.Name, COUNT(*) AS ContentCount FROM categories AS C LEFT JOIN content AS Q ON (CAST(C.id AS CHAR) = (Q.category_ids)) GROUP BY C.Name 

S'il vous plaît ne me dites pas des moyens de changer la base de données. Si des idées que comment puis-je écrire une requête qui me donnera ce genre de jeu de résultats sera très appréciée. CSV dans une base de données est la pire idée de tous les temps.

+2

CSV dans les bases de données est mal, vous avez été mordu. – Johan

Répondre

2


Il va tuer toute chance d'utiliser un index. Ce n'est pas normalisé. C'est lent.
Il continuera à vous mordre encore et encore.

SELECT C.id , C.Name, COUNT(*) AS QuotesCount 
FROM categories AS C 
LEFT JOIN quotes AS Q ON (FIND_IN_SET(c.id,Q.category_ids)) 
GROUP BY C.Name 

Voir: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

+0

Je sais que ce n'est pas normalisé mais de toute façon merci pour l'aide. ça a marché pour moi. – Astha

1

Vous devez pas Normaliser votre table guillemets. Idéalement, vous devriez avoir un devis et un tableau de catégories de prix. Chaque citation est alors seulement stockée une fois dans votre table de citation, la table de catégorie de citation a des colonnes comme des quotidiens, catid ainsi si une citation avait des entrées dans le chat a, b, c vous auriez trois entrées sur la table de catégorie de citation. Vous pouvez ensuite utiliser des jointures et des achats groupés pour répondre à votre question

Questions connexes