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)
但我得到的只有两次,这并不奇怪.
我能想到的唯一解决方案就是拥有一个单独的喜欢和不喜欢的专栏
你可以使用聚合查询,在单个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表中的记录,相关的查询.
| 归档时间: |
|
| 查看次数: |
2603 次 |
| 最近记录: |