0

我决定使用 favs(将该帖子标记为收藏的用户的 ID)作为 favs 列中的逗号分隔列表,该列也在带有发件人、url、内容等的消息表中。

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

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

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

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

您能否告诉我您的想法或使该系统正常工作的任何解决方案?

4

4 回答 4

5

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

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

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

于 2009-04-30T01:17:11.043 回答
3

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

将关联存储在单个列中否定了关系数据库的优势。使用 like 功能会付出性能成本,您不能再存储有关关系的额外数据,并且数据更难查询。

另一种模型可能看起来像这样(不能包含图像,因为我是新用户,但我在这里做了一个):

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
于 2009-04-30T03:13:55.227 回答
2

应该使用这个:

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0
于 2009-06-02T03:27:27.590 回答
1

您可能必须获取值,用 PHP 分解它,然后计算数组。

在 MySQL 中有很多方法可以做到这一点,但据我所见,它们很麻烦。

于 2009-04-30T01:15:52.543 回答