每个userID更新唯一productId的速率

时间:2018-02-18 21:40:43

标签: mysql sql

我要在自己的SQL上实现一个方法。我在MySQL中有两个表。假设每行都在FirstTable中更新,而ratecountView的值都是可变的,我尝试使用相同的命令更新它们:

 UPDATE FirstTable SET `countView`= `countView`+1,
                             `rate`=('$MyRate' + (`countView`-1)*`rate`)/`countView`
                             WHERE `productId`='$productId'

FirstTable:

  productId | countView | rate |     other column  |
------------+-----------+------+-------------------+---
      21    |      12   |   4  |      anything     |
------------+-----------+------+-------------------+---
      22    |      18   |   3  |      anything     |
------------+-----------+------+-------------------+---    

但是这样,用户每次都可以投票。所以我尝试创建一个包含两列productIduserID的表格。如下所示:

SecondTable:

  productId |      userID   | 
------------+---------------|
      21    |      100001   |  
------------+---------------|
      22    |      100002   |   
------------+---------------|
      21    |      100001   |  
------------+---------------|
      21    |      100003   |   
------------+---------------|

现在,正如SecondTable中给出的示例一样,用户已经给了productId两票。所以我不想要记录这两个投票。

此方法存在问题:

  1. 每次投票都会加入计数器的价值。
  2. 我无法正确关联SecondTableFirstTable来管理FirstTable的更新。
  3. 当然,这个问题可能不是全新的,但我搜索了很多才能得到正确的答案。该网站提出的一个问题来自于这种方法。使用此方法,您可以管理表的更新。这种方法如下:

    UPDATE `FirstTable` SET `countView`= `countView`+1,
                            `rate`=('$MyRate' + (`countView`-1)*`rate`)/`countView`
        WHERE `productId`='$productId' IN ( SELECT DISTINCT productId, userID
        FROM SecondTable)
    

    但是下一个问题是,即使我使用此命令,我也会遇到以下错误:

      

    1241 - 操作数应包含1列

    非常感谢你,如果你能指导我的话。而且我确定我的问题不重复......再次感谢你。

2 个答案:

答案 0 :(得分:1)

正在生成错误,因为您无法在“in”语句中返回2个字段。您将要使用group by:

尝试:

IN ( SELECT DISTINCT productId FROM rating group by product, UserID)

如果需要,可以在此处查看mysql组的文档:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

答案 1 :(得分:1)

这可以解决您的特定语法问题:

UPDATE FirstTable
    SET countView = countView + 1,
        rate = ($MyRate + (countView - 1) * rate) / countView
    WHERE productId = $productId AND
          productId IN (SELECT t2.productId FROM SecondTable t2);

但如果两个不同的用户对同一产品进行投票,则FirstTable只会更新一次。目前尚不清楚这是否是故意行为。

请注意,子查询中SELECT DISTINCT