SQL中的条件和计数

时间:2014-01-31 18:44:39

标签: mysql sql

我有一个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语句的一部分,它转换为格式正确的数组非常麻烦。

4 个答案:

答案 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;

希望有所帮助