Mysql:使用Like来计算逗号分隔值

时间:2009-04-30 00:59:38

标签: php mysql csv explode

我决定使用favs(标记该帖子作为收藏的用户的id)作为favs列中的逗号分隔列表,该列也位于包含发件人,网址,内容等的邮件表中。

但是当我尝试用以下查询来计算这些行时:

select count(id) 
from messages 
where favs like '%userid%' 

当然它会返回错误的结果,因为所有id都可能是另一个id的一部分

例如,在查询id = 1时,它还会增加用户ID 11所支持的任何其他内容的计数器...

您能告诉我您的想法或任何使该系统有效的解决方案吗?

4 个答案:

答案 0 :(得分:5)

有几个或者你可以有一个丑陋的解决方案:

select count(id) from messages where favs like 'userid,%' or favs like '%,userid,%' or favs like '%,userid'

我相信,可能会有一个更优雅的解决方案,但至少会返回你正在寻找的结果。

答案 1 :(得分:3)

是否可以更改您的数据模型,以便将用户与其喜爱的消息之间的关联存储在另一个表中?

将关联存储在单个列中会抵消关系数据库的优势。您使用类似功能支付性能成本,您无法再存储有关该关系的其他数据,并且数据更难查询。

替代模型可能看起来像这样(因为我是新用户,所以不能包含图像,但我创建了一个here):

users
 - id

messages
 - id

favorite_messages
 - user_id (foreign key to users.id)
 - message_id (foreign key to messages.id)

有了这个,您的原始查询将简化为以下内容:

select count(1) from favorite_messages where user_id = userid

此外,您可以执行以下操作:获取用户最喜欢的消息列表:

select 
    * 
from 
    messages 
    inner join favorite_messages 
        on messages.id = favorite_messages.message_id
where
    user_id = userid

答案 2 :(得分:2)

应该使用这个:

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0

答案 3 :(得分:1)

您可能必须获取该值,使用PHP将其爆炸,然后计算数组。

有很多方法可以在MySQL中实现,但从我看到的情况来看,它们很麻烦。