我决定使用favs(标记该帖子作为收藏的用户的id)作为favs列中的逗号分隔列表,该列也位于包含发件人,网址,内容等的邮件表中。
但是当我尝试用以下查询来计算这些行时:
select count(id)
from messages
where favs like '%userid%'
当然它会返回错误的结果,因为所有id都可能是另一个id的一部分
例如,在查询id = 1时,它还会增加用户ID 11所支持的任何其他内容的计数器...
您能告诉我您的想法或任何使该系统有效的解决方案吗?
答案 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中实现,但从我看到的情况来看,它们很麻烦。