mysql SQL查询比较整数和字符串

时间:2011-09-21 07:34:30

标签: mysql sql compare

我在将字符串与数据库中不同表的整数列进行比较时遇到问题。

拥有一个包含两个表作为类别和内容的数据库。现在,每个内容文本可以属于多个类别,该类别列在由逗号分隔的内容表的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

请不要告诉我改变数据库的方法。如果有任何想法,我怎么能写一个会给我这种结果集的查询,将会受到高度赞赏。

2 个答案:

答案 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中有条目,则报价类别表中会有三个条目。 然后,您可以使用联接和分组购买来回答您的问题