例如,MySQL表products
显示10个结果,每个产品都有喜欢和不喜欢的按钮。如果用户按下喜欢或不喜欢,则会更新voted
表。
现在我遇到的问题是:检查用户是否投票的正确方法是什么?存储什么如果产品被投票赞成或不喜欢?
如果有300个结果,如果voted
和productid
存在,我不想进行300次查询以检查userid
表格。这样做的正确方法是什么?我仍然希望显示结果,如果用户已经投票,则不会显示相似或不喜欢的按钮。
答案 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并再次投票。
一致的方式是您描述的方式,为每个productId
和userId
保存一行。不需要多次查询,但您只需要执行SELECT count(productID) WHERE productId=1 and userId=42
您可以在不同情况下选择一致性或性能。也许其他数据库引擎将是最好的选择,以及cookie。
答案 3 :(得分:0)
我有一个奇怪的解决方案:)
votes
的产品表格中创建一个字段,输入blob(或文本)将投票用户保存在以下数组中:
$votes = array(
1 => true, // userId => like/dislike (true/false)
);
使用serialize
&使用对象unserialize
{field $votes
)vote
将已投票用户加载或保存到您的数据库。如果产品的投票少于1个,那么votes
字段就像我猜想的那样小:)
然后,您可以检查用户是否由isset($votes[$userId])
投票并且喜欢或不喜欢:
if (isset($votes[$userId]))
if ($votes[$userId] == true) echo 'like'; else echo 'dislike';
因为您通过PHP进行检查所以执行时间并不重要。
希望这有帮助!
答案 4 :(得分:-1)
你可以使用memcache,将值存储为key =>值对,
key可以是“product_id + user_id”,当发生任何变化时,更新db和memcache。