2009-04-30 88 views
0

我决定在favs列中使用favs(标记该帖子为收藏夹的用户的id)作为逗号分隔列表,该列表也在发送者,url,内容等。Mysql:获得逗号分隔值的计数

但是当我尝试用类似的查询数的那些行:

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

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

例如当查询id = 1时,它也会增加任何其他小节的计数器nt,用户ID为11 ...

你能告诉我你的想法或任何解决方案,使这个系统的工作?

回答

5

少数或的,你可以有一个丑陋的解决方案:

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

有可能是一个更好的解决方案,而是一个至少会回报你正在寻找的结果,我相信。

1

您可能需要获取该值,然后用PHP对其进行分解,然后对该数组进行计数。

在MySQL中有办法做到这一点,但从我看到的,他们是一个麻烦。

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

应该使用这个:

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