检查用户是否投票的正确方法是什么?

时间:2012-02-23 10:22:57

标签: php mysql

例如,MySQL表products显示10个结果,每个产品都有喜欢和不喜欢的按钮。如果用户按下喜欢或不喜欢,则会更新voted表。

现在我遇到的问题是:检查用户是否投票的正确方法是什么?存储什么如果产品被投票赞成或不喜欢?

如果有300个结果,如果votedproductid存在,我不想进行300次查询以检查userid表格。这样做的正确方法是什么?我仍然希望显示结果,如果用户已经投票,则不会显示相似或不喜欢的按钮。

5 个答案:

答案 0 :(得分:4)

表A存储产品,例如

id | product |

表B存储用户投票,例如

id | user_id | product_id | vote (like/dislike)

然后你可以做一个简单的连接查询

SELECT `A`.`id`, `A`.`product`, `B`.`vote` from `A` LEFT JOIN `B` on `A`.`id` = `B`.`product_id` WHERE `B`.`user_id` = $current_user_id_value;

然后结果集看起来像这样

id |   product   |   vote   |
 1 | "product 1" |  NULL    |
 2 | "product 2" |  like    |
 3 | "product 3" |  dislike |
 4 | "product 4" |  NULL    |
...

答案 1 :(得分:3)

使用left outer join添加用户ID与当前用户匹配的投票表行,且产品ID与product表格中的产品ID与结果集匹配。

答案 2 :(得分:0)

最简单的方法是为用户和他们投票的产品设置cookie。当然,用户可以删除他们的cookie并再次投票。

一致的方式是您描述的方式,为每个productIduserId保存一行。不需要多次查询,但您只需要执行SELECT count(productID) WHERE productId=1 and userId=42

您可以在不同情况下选择一致性或性能。也许其他数据库引擎将是最好的选择,以及cookie。

答案 3 :(得分:0)

我有一个奇怪的解决方案:)

  1. 在名为votes的产品表格中创建一个字段,输入blob(或文本)
  2. 将投票用户保存在以下数组中:

    $votes = array( 1 => true, // userId => like/dislike (true/false) );

  3. 使用serialize&使用对象unserialize {field $votesvote将已投票用户加载或保存到您的数据库。如果产品的投票少于1个,那么votes字段就像我猜想的那样小:)

  4. 然后,您可以检查用户是否由isset($votes[$userId])投票并且喜欢或不喜欢:

    if (isset($votes[$userId])) if ($votes[$userId] == true) echo 'like'; else echo 'dislike';

  5. 因为您通过PHP进行检查所以执行时间并不重要。

    希望这有帮助!

答案 4 :(得分:-1)

你可以使用memcache,将值存储为key =>值对,

key可以是“product_id + user_id”,当发生任何变化时,更新db和memcache。