我有一个MySQL表 “评级”,
an ID column
a column called like_dislike (holds either null, 0, or 1),
and a column called lesson_id (a foreign key from lessons).
MySQL表,“课程”,带
an ID column
a teacher_id column
我需要选择此信息:
"SELECT r.like_dislike FROM ratings r INNER JOIN lessons l on l.lesson_id = r.lesson_id";
然而,这实际上是一个更大的SQL语句的一部分,我想做的是:
Foreach lesson_id, if like_dislike == 0, SELECT count(like_dislike) as like
和
Foreach lesson_id, if like_dislike == 1, SELECT count(like_dislike) as dislike
我不知道如何将这个伪代码转换为SQL。我还需要在SQL中执行此操作,而不是像PHP那样,因为它是更大的SQL语句的一部分,它转换为格式正确的数组非常麻烦。
答案 0 :(得分:1)
您应该能够通过分组来完成此任务。例如:
SELECT r.lesson_id, COUNT(*) AS like
FROM ratings r
INNER JOIN lessons l ON l.lesson_id = r.lesson_id
WHERE r.like_dislike = 0
GROUP BY r.lesson_id;
对于不喜欢,只需将WHERE
子句更改为
WHERE r.like_dislike = 1
修改强>
通过添加另一级别的分组,可以将其组合成一个查询请求:
SELECT r.lesson_id, r.like_dislike, COUNT(*) AS count
FROM ratings r
INNER JOIN lessons l ON l.lesson_id = r.lesson_id
GROUP BY r.lesson_id, r.like_dislike;
This will give you output, for example: +-----------+--------------+-------+ | lesson_id | like_dislike | count | +-----------+--------------+-------+ | 1 | 0 | 12 | | 1 | 1 | 7 | | 2 | 0 | 1 | | 2 | 1 | 4 | +-----------+--------------+-------+
因此对于1的lesson_id,有12个喜欢,7个不喜欢等...
编辑2:
要为每个lesson_id获取一行,您可以稍微修改一下该语句:
SELECT r.lesson_id,
CASE WHEN r.like_dislike = 0 THEN COUNT(*) END AS like,
CASE WHEN r.like_dislike = 1 THEN COUNT(*) END AS dislike
FROM ratings r
INNER JOIN lessons l ON l.lesson_id = r.lesson_id
GROUP BY r.lesson_id, r.like_dislike;
就此而言,您根本不需要加入课程表,除非您以某种方式获得未链接到课程的评分。如果您想要包含没有评分的课程,则必须更改为OUTER加入:
SELECT l.lesson_id,
CASE WHEN r.like_dislike = 0 THEN COUNT(*) END AS like,
CASE WHEN r.like_dislike = 1 THEN COUNT(*) END AS dislike
FROM lessons l
LEFT JOIN ratings r ON r.lesson_id = l.lesson_id
GROUP BY l.lesson_id, r.like_dislike;
答案 1 :(得分:1)
也许您可以使用case
语句,如下所示:
SELECT r.lesson_id,
case when r.like_dislike == 0 then (count(*)) end as like,
case when r.like_dislike == 1 then (count(*)) end as dislike
FROM ratings r INNER JOIN lessons l ON l.lesson_id = r.lesson_id
GROUP BY r.lesson_id, r.like_dislike
我没有测试过,但你可以看到这个想法。此外,您必须将case
设置为1,将另一个设置为0,因为like_dislike可以为null。
答案 2 :(得分:0)
试试这个
SELECT if(r.like_dislike =0 ,count(like_dislike) as like , if( r.like_dislike =1 , count(like_dislike) as dislike, 'its null'))
FROM ratings r
INNER JOIN lessons l on l.lesson_id = r.lesson_id
答案 3 :(得分:0)
如果要在yr数据表上添加条件,则按以下方式编写代码:
count_inversions_fast(array, values.size()) << endl;
希望有所帮助