在mysql中为每个产品选择喜欢/不喜欢的方法

在mysql中为每个产品选择喜欢/不喜欢的方法,mysql,sql,Mysql,Sql,请看一看 我有两个表来存储用户对产品的喜欢/不喜欢。我使用右键连接在页面上列出每个玩具的喜欢和不喜欢的数量。我想知道这是否是获得此输出的适当方法: TOY LIKES DISLIKES ToyA 2 0 ToyB 0 0 ToyC 0 0 ToyD 1 2 ToyE 0 0 ToyF 0 0 ToyG 0 1 ToyH 1 0 ToyI 0 0 我提出的另一种方法是将喜欢/不喜欢的数量存储在表toy中

请看一看

我有两个表来存储用户对产品的喜欢/不喜欢。我使用
右键连接
在页面上列出每个玩具的喜欢和不喜欢的数量。我想知道这是否是获得此输出的适当方法:

TOY   LIKES DISLIKES
ToyA    2   0
ToyB    0   0
ToyC    0   0
ToyD    1   2
ToyE    0   0
ToyF    0   0
ToyG    0   1
ToyH    1   0
ToyI    0   0
我提出的另一种方法是将喜欢/不喜欢的数量存储在表
toy
中,这样就不需要正确的联接,但当有人投票时,它需要额外的insert查询。你喜欢哪一个

   SELECT 
          b.toy,
          IFNULL(SUM( liketype =1 ),0)AS likes, 
          IFNULL(SUM( liketype =0 ),0) AS dislikes
          FROM `product_review` a 
          RIGHT JOIN toy b
          ON b.ID = a.toyid 
          GROUP BY b.toy
桌子


如果用户投票的数量太多&您需要计算并显示多次投票的结果,那么此加入可能是一项开销。另一方面,将投票信息存储在单独的表中会更加灵活。所以我个人更喜欢混合两种解决方案:

保留
product\u review
table&在toy表中添加喜欢/不喜欢的数量,然后在
product\u review
table上添加触发器,以便在每次插入投票记录后更新
toy
表中相应玩具的喜欢/不喜欢字段。这就像一个缓存,可以帮助您同时从两个解决方案中获益。

如果您最终拥有非常大的用户群,则存储聚合喜好可能会有所帮助,但对于一个小型站点来说,这并不重要。如果执行聚合表,则不应在用户喜欢或不喜欢某个产品时插入,而应定期运行查询以对
product\u review
表求和。(例如,如果用户反复喜欢某个产品,或者反复喜欢,然后又不喜欢同一个产品,会发生什么情况?)为可怜的、被忽视的右加入欢呼!只需存储玩具id、用户id和一个标志(“1”或“0”),以表明他们是“喜欢”还是“不喜欢”它。如果你喜欢的话,你可以称那个专栏为“喜欢”
CREATE TABLE toy
    (`ID` int, `toy` varchar(21), `like` int ,`dislike` int)
;

INSERT INTO toy
    (`ID`,`toy`, `like`,`dislike`)
VALUES
    (1, 'ToyA', 2, 0),
    (2, 'ToyB',0 , 0),
    (3, 'ToyC', 0, 0),
    (4, 'ToyD', 1, 2),
    (5, 'ToyE', 0, 0),
    (6, 'ToyF', 0, 0),
    (7, 'ToyG',0, 1),
    (8, 'ToyH',0, 1),
    (9, 'ToyI', 0, 0)
;



CREATE TABLE product_review
    (`ID` int,`user` varchar(20), `toyid` varchar(21), `liketype` int)
;

INSERT INTO product_review
    (`ID`, `user`,`toyid`, `liketype`)
VALUES
    (1, 'Tom','1', 1),
    (2, 'Ben', '4',0),
    (3, 'Peter','1', 1),
    (4, 'May','4', 0),
    (5, 'May', '8',1),
    (6, 'Tom','7',0),
    (7, 'Paul','4', 1)
;