Mysql跟踪用户喜欢和不喜欢的内容

and*_*rew 2 php mysql normalization

我正在创建一个公告板应用程序.每个公告都可以被网站的用户所喜欢或不喜欢.为了跟踪喜欢和不喜欢,我创建了以下数据库表

id  user_id   bulletin_id   like_dislike
1   1         1             1
2   1         2             0
3   3         1             1
4   2         1             0
Run Code Online (Sandbox Code Playgroud)

在like_dislike列中,1表示"喜欢它",0表示"不喜欢它"我知道如何提问. - 公告1喜欢的次数(2) - 公告1不喜欢的次数(1)

但是,我如何进行查询以同时提出这两个问题呢?也就是说,公告1喜欢和不喜欢多少次

liked  disliked
2      1
Run Code Online (Sandbox Code Playgroud)

我试过了这个问题

  SELECT count(like_dislike) AS likes, count(like_dislike) AS dislikes FROM bulletins_ld
where bulletins_id = 1 AND likes = 1 AND dislikes = 0
Run Code Online (Sandbox Code Playgroud)

但我得到的只有两次,这并不奇怪.
我能想到的唯一解决方案就是拥有一个单独的喜欢和不喜欢的专栏

Dan*_*n J 6

你可以使用聚合查询,在单个like_dislike列上使用相反的条件(我假设在下面,该列中的'1'表示'喜欢').

SELECT bulletin_id, 
       SUM(CASE WHEN like_dislike = 1 THEN 1 ELSE 0 END) AS likes, 
       SUM(CASE WHEN like_dislike = 0 THEN 1 ELSE 0 END) AS dislikes
FROM bulletins_ld
GROUP BY bulletin_id
Run Code Online (Sandbox Code Playgroud)

更新:根据下面评论中的讨论,喜欢/不喜欢列可以归一化到它自己的表中,就像这样(例如故意愚蠢......):

CREATE TABLE how_user_feels(
    feeling_id INT,
    feeling_desc VARCHAR(20)
)

INSERT INTO how_user_feels(feeling_id, feeling_desc) VALUES
(0, 'Undecided'),
(1, 'Likes It'),
(2, 'Could Do Without It')
Run Code Online (Sandbox Code Playgroud)

然后,Bulletin表中的Likes_Dislikes列被外键替换feeling_id,默认值为0.假设您在用户首次查看公告时输入此表中的记录,默认情况下将其设置为"未定",并更新当他们在公告上投票时记录.您可以像这样查询结果:

SELECT bulletin_id, 
       SUM(CASE WHEN feelings_id = 1 THEN 1 ELSE 0 END) AS likes, 
       SUM(CASE WHEN feelings_id = 2 THEN 1 ELSE 0 END) AS dislikes,
       SUM(CASE WHEN feelings_id = 0 THEN 1 ELSE 0 END) AS doesnt_seem_to_care
FROM bulletins_ld b
INNER JOIN how_user_feels h ON b.feeling_id = h.feeling_id
GROUP BY bulletin_id
Run Code Online (Sandbox Code Playgroud)

请记住,这只是一种方法,在您的情况下可能没用.但是,如果您决定更改扩展用户表达他们对公告的感受的模型,比如五星级评级系统,您可以在不更改数据库架构的情况下执行此操作 - 只需更改how_user_feels表中的记录,相关的查询.

  • @djacobson.你可以删除`INNER JOIN ON b.feeling_id = h.feeling_id`它什么都不做的结果集(你是不是正从'h`任何东西)how_user_feels小时,它会降低性能. (2认同)