【问题标题】:Mysql: Getting Count of Comma Separated Values With LikeMysql:使用Like获取逗号分隔值的计数
【发布时间】:2010-10-22 17:49:00
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: php mysql csv explode


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        将关联存储在单个列中会否定关系数据库的优势。使用 like 函数需要付出性能成本,无法再存储有关关系的额外数据,而且数据更难查询。

        另一种模型可能看起来像这样(因为我是新用户,所以不能包含图片,但我做了一个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
        

        【讨论】:

          【解决方案4】:

          应该使用这个:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-25
            • 1970-01-01
            • 1970-01-01
            • 2013-04-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多