1

我有一张这样的桌子

列名

中等,评级

M1 R1

M1 R2

M2 R3

M3 R4

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

预期结果是中等和它的评级。

从电影中选择 *

其中 2 = (select count(*) from movie b group by b.mid and b.mid=mid )

这没有按预期工作,我什至不知道它在做什么。谁能向我解释我该怎么做才能获得预期的结果。

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

4

6 回答 6

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
于 2013-02-21T21:08:18.353 回答
1

如果你不能使用HAVING,那么你可以使用这样的东西:

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

请参阅带有演示的 SQL Fiddle

如果要返回具有不同评分计数的那些,则可以使用:

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

请参阅带有演示的 SQL Fiddle

于 2013-02-21T21:15:35.317 回答
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
于 2013-02-21T21:25:02.710 回答
0

你可以这样做:

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

在这里,您只需计算rating每组的出现次数mid。然后您过滤该值(存储在rating_count此处)。

于 2013-02-21T21:09:19.570 回答
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)
于 2013-02-21T21:17:18.287 回答
0

HAVING可以而且应该使用;我用 SQLite 2.8.17 和 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. 如果您想要多个子句,它会更灵活,例如具有两个评级或 mid='M3' 的电影
  2. 它会比 Lamak 的第二个解决方案执行得更好(解释计划显示打了三个表)
  3. 更容易阅读和理解
于 2013-02-21T21:45:01.390 回答