我有一张这样的桌子
列名
中等,评级
M1 R1
M1 R2
M2 R3
M3 R4
我想准确返回两个评分的电影(这是我正在解决的问题的一个小问题)
预期结果是中等和它的评级。
从电影中选择 *
其中 2 = (select count(*) from movie b group by b.mid and b.mid=mid )
这没有按预期工作,我什至不知道它在做什么。谁能向我解释我该怎么做才能获得预期的结果。
我不能使用,我必须将“子查询的结果”与 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
如果你不能使用HAVING,那么你可以使用这样的东西:
select *
from movie m1
where 2 = (select count(*)
from movie m2
where m1.mid = m2.mid)
如果要返回具有不同评分计数的那些,则可以使用:
select *
from movie m1
where 2 = (select count(distinct rating)
from movie m2
where m1.mid = m2.mid)
使用您的原始查询:
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
你可以这样做:
SELECT `mid`, count(rating) AS `rating_count`
FROM table
WHERE `rating_count` = 2
GROUP BY `mid`
在这里,您只需计算rating每组的出现次数mid。然后您过滤该值(存储在rating_count此处)。
如果您想显示实际收视率,请遵循这些原则
SELECT mid, rating FROM movie m
JOIN (SELECT mid, COUNT(*) FROM movie GROUP BY mid HAVING COUNT(*)=2) c
ON (m.mid = c.mid)
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应该使用有几个原因: