MySQL:选择多个枚举值的计数

MySQL:选择多个枚举值的计数,mysql,enums,Mysql,Enums,我正在制作一个电影评级应用程序,用户可以将电影评级为“喜欢”或“不喜欢”。所以我做了3张表,分别是用户表、电影表和评级表。投票表的示例如下: userID movieID Vote x a li y a dli y b li w a li 该表的架构为: userID - PrimaryKey movieID - PrimaryKey

我正在制作一个电影评级应用程序,用户可以将电影评级为“喜欢”或“不喜欢”。所以我做了3张表,分别是用户表、电影表和评级表。投票表的示例如下:

userID    movieID     Vote

 x        a           li
 y        a           dli
 y        b           li
 w        a           li
该表的架构为:

userID - PrimaryKey
movieID - PrimaryKey
Vote - Enum('li','dli')
我已经将userID和movieID作为主键,这样,如果用户更新了他/她的首选项,那么如果记录在那里,特定的行就会得到更新

编辑:这是电影表的模式

mID - PrimaryKey
mName - Varchar
mGenre - Varchar
mDesc -  Text
mDateOfRelease - Date
我的问题是,是否可以从电影表中选择所有列,并在一次db调用中选择该电影的喜欢和不喜欢计数。如果是,我该怎么做?

试试以下方法:

SELECT 
    votes.movieID, 
    likes.like_count, 
    dislikes.dislike_count
FROM votes
LEFT join (
    SELECT movieID, count(Vote) as like_count
    FROM votes
    WHERE Vote = 'li'
    GROUP BY movieID
) likes ON likes.movieID = votes.movieID
LEFT join (
    SELECT movieID, count(Vote) as dislike_count
    FROM votes
    WHERE Vote = 'dli'
    GROUP BY movieID
) likes ON likes.movieID = votes.movieID
试试这个:

SELECT 
    votes.movieID, 
    likes.like_count, 
    dislikes.dislike_count
FROM votes
LEFT join (
    SELECT movieID, count(Vote) as like_count
    FROM votes
    WHERE Vote = 'li'
    GROUP BY movieID
) likes ON likes.movieID = votes.movieID
LEFT join (
    SELECT movieID, count(Vote) as dislike_count
    FROM votes
    WHERE Vote = 'dli'
    GROUP BY movieID
) likes ON likes.movieID = votes.movieID
试试这个:

select m.*, 
sum(case when v.vote = li then 1 else 0 end) li_count, 
sum(case when v.vote = dli then 1 else 0 end) dli_count
from movie m left join vote v on m.movieID = v.movieID 
group by m.mId (which is enough in mySQL)
试试这个:

select m.*, 
sum(case when v.vote = li then 1 else 0 end) li_count, 
sum(case when v.vote = dli then 1 else 0 end) dli_count
from movie m left join vote v on m.movieID = v.movieID 
group by m.mId (which is enough in mySQL)

假设您有一部电影,它包含字段
id
。以下是您可以做的:

select m.*,sum(case when r.vote like 'li' then 1 else 0 end) likes,
sum(case when r.vote like 'dli' then 1 else 0 end) dislikes from movie m
left join rating r
on r.movieID = m.mID
group by m.mID;
左联基本上是不赞成投票的。如果这部电影的评级表为空,它仍然会显示出来

编辑: 为了解释这一点,我将删去这个问题

我们需要了解group by在做什么。你可以找到文件。简而言之,我们根据GROUPBY语句中列的不同条目创建数据组

select count(r.movieID) from rating r
group by r.movieID;
这将告诉我们每部电影获得多少选票(这里我们只列出在评分表中获得任何投票的电影)。因此,在此之后,我们可以进行“智能”计数,并使用条件计数。在定义中可以有一个表达式。这意味着当。。。然后。。。end也可以工作。所以我们只是总结一下所有的“li”,不要用“dli”来表示喜欢,用相反的来表示不喜欢

唯一的一个大缺点是我们没有所有的电影(想想没有投票权的情况)。然后此选择将跳过此操作。现在我们有了。这个想法非常简单-我们包括所有的表格电影行,无论在评级表中发生了什么打开我们用于将这些连接到表。然后我们回忆起我们以前做过的总结,但是将group by改为mID(它总是存在且非空,所以我们总是有一些东西可以分组)。在这种情况下,你会得到你想要的。还可以处理这个查询(结果查询)。试着理解如果你把你的评分栏放在“分组方式”语句中会发生什么。(大量文本的阅读比阅读更容易:)

如果有不清楚的地方,请告诉我,我会尽力改进


希望它有帮助

让我们假设您有一部电影,它包含字段
id
。以下是您可以做的:

select m.*,sum(case when r.vote like 'li' then 1 else 0 end) likes,
sum(case when r.vote like 'dli' then 1 else 0 end) dislikes from movie m
left join rating r
on r.movieID = m.mID
group by m.mID;
左联基本上是不赞成投票的。如果这部电影的评级表为空,它仍然会显示出来

编辑: 为了解释这一点,我将删去这个问题

我们需要了解group by在做什么。你可以找到文件。简而言之,我们根据GROUPBY语句中列的不同条目创建数据组

select count(r.movieID) from rating r
group by r.movieID;
这将告诉我们每部电影获得多少选票(这里我们只列出在评分表中获得任何投票的电影)。因此,在此之后,我们可以进行“智能”计数,并使用条件计数。在定义中可以有一个表达式。这意味着当。。。然后。。。end也可以工作。所以我们只是总结一下所有的“li”,不要用“dli”来表示喜欢,用相反的来表示不喜欢

唯一的一个大缺点是我们没有所有的电影(想想没有投票权的情况)。然后此选择将跳过此操作。现在我们有了。这个想法非常简单-我们包括所有的表格电影行,无论在评级表中发生了什么打开我们用于将这些连接到表。然后我们回忆起我们以前做过的总结,但是将group by改为mID(它总是存在且非空,所以我们总是有一些东西可以分组)。在这种情况下,你会得到你想要的。还可以处理这个查询(结果查询)。试着理解如果你把你的评分栏放在“分组方式”语句中会发生什么。(大量文本的阅读比阅读更容易:)

如果有不清楚的地方,请告诉我,我会尽力改进


希望有帮助

你自己试过吗?在建议之间,如果只有喜欢/不喜欢,请使用整数。您可以发布电影表的布局吗?这将有助于编写一个示例SQL语句来实现这一点。使用联接、分组方式、计数等。不会那么困难:)您自己尝试过吗?在建议之间,如果只有喜欢/不喜欢,请使用整数。您可以发布电影表的布局吗?这将有助于组合一个示例SQL语句来实现这一点。使用连接、分组方式、计数等。这不会那么困难:)嘿,它正在工作,谢谢。。。!我刚刚开始学习MySqlWell,你能解释一下这里发生了什么吗?值得一提的是,在Mysql中,你不需要按所有的m字段分组。m、 mId已经足够了。是的,我们可以移除(m中的所有cols)partHey开始工作了,谢谢。。。!我刚刚开始学习MySqlWell,你能解释一下这里发生了什么吗?值得一提的是,在Mysql中,你不需要按所有的m字段分组。m、 mId就足够了。是的,我们可以删除(m中的所有COL)partHi,你能解释一下这里发生了什么吗?谢谢你这么棒的解释…是的,我正在修改查询:)也要尝试加入用户表…还有一个疑问,如果我继续加入多个表,会影响我的查询获取速度吗?嗯,如果您要进行完全扫描(这意味着没有任何连接表达式,或者它是无用的表达式),那么它可能会给您带来较差的性能。所有不会导致您对表格进行完整扫描的内容都会很好。然而,有时需要完全扫描,所以-继续练习并使用表达式,尽可能多地指定你的行。嗨,你能解释一下这里发生了什么吗?谢谢你这么棒的解释…是的,我正在修改