【问题标题】:MySQL - Get similarity score from where two different rows meet same condition from two columnsMySQL - 从两个不同的行从两列满足相同条件的位置获取相似度分数
【发布时间】:2017-12-06 10:04:21
【问题描述】:

我想要做的是通过将一个表中的评级列与另一个表中的评级列进行比较来生成相似度百分比。

但是,这需要限制在一个表中的 id 与另一个表中的 id 匹配、针对特定用户并且两个表的评级列中存在评级的情况。

例如,table1 有以下列和数据:

   id   |   rate (out of 10)  
=====================
   1    |    8
   2    |    10
   3    |    5
   4    |    4
   5    |    0
   6    |    9
   7    |    8

table2有以下列和数据:

 movid  |   userid   |   rating (out of 10)   
================================
   1    |     3      |    6
   2    |     2      |    10
   3    |     1      |    4
   4    |     3      |    7
   5    |     3      |    6
   6    |     4      |    8
   7    |     3      |    5

假设我想使用 'userid' = 3 的任何行,并将其从 table2 中的“评级”与 中的“率”列进行比较table1 其中 'rate' > 0 和两个表中的 id/movid 具有相同的编号。

使用上面的示例,要比较的结果应限于:

   id   |   rate   
=====================
   1    |    8
   4    |    4
   7    |    8

 movid  |   userid   |   rating   
================================
   1    |     3      |    6
   4    |     3      |    7
   7    |     3      |    5

尽管用户 ID 3 在 table2 中对 movid 5 有评分,但在 table1 中对 id 5 的评分为 0(无评分) ,所以它不会比较那些。

这将比较每个 id/movid 的评分,然后将其计入总体总数。由于评分数字是基于满分 10 分,我猜测确定相似度百分比的最佳方法是取每个 id/movid 之间的差异,然后从 10 中减去它以获得百分比数字。

对于 id/movid 1,table1 中的 'rate' 为 8,table2 中的 'rating'是 6。这些数字之间的差是 2。我们从 10 中减去 2,得到 id/movid 1 的 80% 相似度分数。

每次比较都需要这样做,然后将它们加在一起。

所以根据我的计算,id/movid 1、4 和 7 的相似度得分加起来为 73%(四舍五入,不带小数)。

这个总百分比金额是我想要达到的最终结果。谁能帮我吗?为了让它发挥作用,我拔掉了所有的头发,现在我已经秃了。

【问题讨论】:

    标签: php mysql database select


    【解决方案1】:
    SELECT ROUND(SUM(10-ABS(table1.rate-table2.rating))*10/count(table1.id)) as per FROM table1 INNER JOIN table2 ON table1.id=table2.movieid WHERE userid=3 and table1.rate <> 0 GROUP BY userid
    

    这会给你你所需要的。

    【讨论】:

    • 当负值大于 10 时,对负值进行一点更改将给出 100% 正确
    • 感谢您的帮助。我可以理解您在其中输入的很多内容,即使确保我正确输入了正确的表和列,我仍然收到资源 id #25 错误。也许是我造成的……
    • 我仍然得到相同的资源 ID #25 错误。调用此查询时我不需要做任何其他事情吗?这就是我的方法: 0 GROUP BY userid"; $result=mysql_query($sql);回显$结果; ?>
    • 你无法回显结果
    • $row = mysql_fetch_array($result);然后 print_r($row);你会得到数组
    【解决方案2】:

    我想你正在寻找的是:

    SEELCT table1.id, table1.rate, table2.rating
    FROM table1 INNER JOIN table2 ON table1.id=table2.movid
    WHERE table1.rate>0 AND table2.userid=3
    

    一个简单的 INNER 连接加上 where 子句中的过滤器来过滤 userid=3 并显示大于零的比率

    【讨论】:

      【解决方案3】:

      以下不是最好的解决方案,但应该可以:

      select ROUND(sum(tmp.similarity_score)/max(tmp.cnt)) as Total_similarity_score
      from
      (
      select t1.id,t1.rate,t2.movid,t2.rating,
      (10 - abs(t1.rate-t2.rating))*10 as similarity_score,
      (@cnt := @cnt +1)  as cnt 
      from t1
      inner join t2
      on t2.movid = t1.id
      cross join (select @cnt := 0)r
      where userid = 3
      and t1.rate <> 0
      )tmp  
      ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-11
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多