我有一张这样的表
列名称
中期,评价
M1 R1
M1 R2
M2 R3
M3 R4
我想要准确地返回两个评级的电影(这是我正在解决的问题的一个小问题)
预期结果为中期及其评级。
从电影中选择*
其中2 =(从b.mid和b.mid = mid中选择电影b组中的计数(*))
这没有按预期工作,我甚至不知道它在做什么。任何人都可以向我解释我能做些什么来获得预期的结果。
我不能使用,我必须将'子查询的结果'与2进行比较。
答案 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)
如果您想要返回具有不同评级数的那些,那么您可以使用:
select *
from movie m1
where 2 = (select count(distinct rating)
from movie m2
where m1.mid = m2.mid)
答案 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
应该用于以下几个原因: