写一个SQL查询返回两个评级的电影?

时间:2013-02-21 21:06:57

标签: sql sqlite

我有一张这样的表

列名称

  

中期,评价

     

M1 R1

     

M1 R2

     

M2 R3

     

M3 R4

我想要准确地返回两个评级的电影(这是我正在解决的问题的一个小问题)

预期结果为中期及其评级。

  

从电影中选择*

     

其中2 =(从b.mid和b.mid = mid中选择电影b组中的计数(*))

这没有按预期工作,我甚至不知道它在做什么。任何人都可以向我解释我能做些什么来获得预期的结果。

  

我不能使用,我必须将'子查询的结果'与2进行比较。

6 个答案:

答案 0 :(得分:2)

试试这个:

SELECT mid
FROM YourTable
GROUP BY mid
HAVING COUNT(*) = 2

<强>更新

好吧,如果你不能使用HAVING(为什么?),那么你可以试试JOIN

SELECT A.* 
FROM movie A
INNER JOIN (SELECT mid, COUNT(*) ratings
            FROM movie
            GROUP BY mid) B
    ON A.mid = B.mid
WHERE 2 = B.ratings

答案 1 :(得分:1)

如果您无法使用HAVING,那么您可以使用以下内容:

select *
from movie m1
where 2 = (select count(*)
           from movie m2
           where m1.mid = m2.mid)

请参阅SQL Fiddle with Demo

如果您想要返回具有不同评级数的那些,那么您可以使用:

select *
from movie m1
where 2 = (select count(distinct rating)
           from movie m2
           where m1.mid = m2.mid)

请参阅SQL Fiddle with Demo

答案 2 :(得分:1)

使用原始查询:

select * from 
mid a where 
(
    (select count(*) 
       from mid b 
      where b.mid = a.mid 
      group by b.mid) = 2
);

刚刚为外部表添加了别名,并将子查询比较的括号添加到2。

Results:
mid     rating
m1      r1
m1      r2

答案 3 :(得分:0)

你可以这样做:

SELECT `mid`, count(rating) AS `rating_count`
FROM table
WHERE `rating_count` = 2
GROUP BY `mid`

在这里,您只需计算每组rating的{​​{1}}出现次数。然后,您可以过滤该值(此处存储在mid中)。

答案 4 :(得分:0)

如果您想显示实际评分

,请按照以下方式进行操作
SELECT mid, rating FROM movie m
JOIN (SELECT mid, COUNT(*) FROM movie GROUP BY mid HAVING COUNT(*)=2) c 
ON (m.mid = c.mid)

答案 5 :(得分:0)

可以而且应该使用

HAVING;我测试了SQLite 2.8.17&amp; 3.6.22。

要获得两个评级的电影:

SELECT mid
FROM movie
GROUP BY mid
HAVING COUNT(*) = 2;

然后,您可以在IN

中使用它
SELECT *
FROM movie
WHERE mid in (
    SELECT mid
    FROM movie
    GROUP BY mid
    HAVING COUNT(*) = 2
);

或加入它:

SELECT movie.*
FROM movie
    JOIN (
        SELECT mid
        FROM movie
        GROUP BY mid
        HAVING COUNT(*) = 2
    ) those_with_two
        ON movie.mid = those_with_two.mid;

完整的测试用例设置,供参考:

$ sqlite3 so-movie

create table movie (
    mid varchar(10),
    rating varchar(10)
);

insert into movie values('M1','R1');
insert into movie values('M1','R2');
insert into movie values('M2','R3');
insert into movie values('M3','R4');

我说HAVING应该用于以下几个原因:

  1. 如果你想要多个子句,它会更灵活,例如:有两个等级或中等='M3'的电影
  2. 它将比Lamak的第二个解决方案表现更好(解释计划显示击中三个表)
  3. 更容易阅读和理解