我在将字符串与数据库中不同表的整数列进行比较时遇到问题。
拥有一个包含两个表作为类别和内容的数据库。现在,每个内容文本可以属于多个类别,该类别列在由逗号分隔的内容表的category_ids列中。我知道它没有正常化。但它已经存在了。
类别表
id | name | timestamp
1 aaa something
2 bbb something
3 ccc something
4 ddd something
5 eee something
内容表
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
现在我必须显示每个类别中内容文本计数的类别列表。 表示使用该类别的内容文本的数量。注意(类别eee不在任何内容文本中,因此在结果集中显示0计数。)
aaa(4)
bbb(3)
ccc(2)
ddd(1)
eee(0)
我尝试了很多方法将类别表的id与内容表的category_ids进行比较。但一个是整数,另一个是字符串。
我试过的一种方法是投射功能但是失败了
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
请不要告诉我改变数据库的方法。如果有任何想法,我怎么能写一个会给我这种结果集的查询,将会受到高度赞赏。
答案 0 :(得分:2)
数据库中的CSV是最糟糕的想法
它会杀死任何使用索引的机会。它没有正常化。这很慢。
它会一次又一次地咬你。
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
请参阅:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
答案 1 :(得分:1)
您无需规范化报价表。理想情况下,你应该有一个报价和一个报价类别表。然后每个报价只在报价表中存储一次,报价类别表中有像quotid,catid这样的列,因此如果报价在cat a,b,c中有条目,则报价类别表中会有三个条目。 然后,您可以使用联接和分组购买来回答您的问题