1

このようなテーブルがあります

列名

中、評価

M1 R1

M1 R2

M2 R3

M3 R4

正確に 2 つの評価の映画を返したい (これは私が解決している問題の小さな問題です)

期待される結果は mid であり、その評価。

select * from movie

ここで 2 = (b.mid および b.mid=mid によって映画 b グループから count(*) を選択)

これは期待どおりに機能していません。何をしているのかさえわかりません。期待される結果を得るために何ができるかを誰かに説明してもらえますか。

「サブクエリの結果」を 2 と比較する必要があるため、having を使用できません。

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

HAVING使用できますし、使用する必要があります。SQLite 2.8.17 & 3.6.22 でテストしました。

2 つの評価の映画を取得するには:

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. 複数の句が必要な場合はより柔軟です。たとえば、2 つの評価がある映画や mid='M3' の場合です。
  2. Lamakの2番目のソリューションよりも優れたパフォーマンスを発揮します(説明計画は、3つのテーブルにヒットすることを示しています)
  3. 読みやすく理解しやすい
于 2013-02-21T21:45:01.390 に答える
0

You can do this:

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

Here you simply count the number of occurrences of rating for each group of mid. You then filter on that value (which is stored in rating_count here).

于 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 に答える