3

私はSQLiteを使用しています。簡単な問題については助けが必要です。これが私の3つのテーブルです。

--------------
problem
--------------
id (primary key)
question_id (foreign key)

--------------
question
--------------
id (primary key)
answer_id (foreign key)

--------------
answer
--------------
id (primary key)

問題のすべての質問で少なくともN個の回答があるすべての問題を取得したいと思います。例を挙げましょう:

-------
problem
id 
1
2


-------
question 
id   problem_id
1    1
2    1
3    1
4    2

-------
answer
id   question_id
1    1
2    1
3    1
4    2
5    2
6    3
7    4
8    4

n = 2の場合、結果はproblem_id=2になります。

私はこれを試しました:

   select distinct question.problem_id 
   from answer, question
   where answer.question_id = question.id
   group by answer.question_id
   having count(*) >= 2

ただし、少なくとも1つの質問と少なくとも2つの回答で問題が発生するため、機能しません。すべての質問はその条件を満たす必要があります。

何か問題はありますか?

4

3 に答える 3

3
select problem_id
from
(
    select q.problem_id, q.id, count(a.id) answercount
    from question q
    left join answer a on a.question_id = q.id
    group by q.problem_id, q.id
) g
group by problem_id
having min(answercount) >= 2

代替案(たとえば4つの回答)

select distinct q.problem_id
from question q
left join answer a on a.question_id = q.id
left join answer b on b.question_id = q.id and a.id < b.id
left join answer c on c.question_id = q.id and b.id < c.id
left join answer d on d.question_id = q.id and c.id < d.id
where d.id is not null

必要に応じて、このパターンを拡張できます。パラメータ化された単一のクエリが本当に必要な場合は、次のようにWHERE句を変更して、6回結合するなどのクレイジーなことを行うことができます。

where case when f.id is not null then 6
           when e.id is not null then 5
           when d.id is not null then 4
           when c.id is not null then 3
           when b.id is not null then 2
           else 1 end >= {{YourParamHere}}
于 2012-10-25T00:44:42.093 に答える
2

T-SQLの問題については、次のように説明します。

declare @problem table(id bigint not null primary key clustered)
declare @question table(id bigint not null primary key clustered, problem_id bigint)
declare @answer table(id bigint not null primary key clustered, question_id bigint)

declare @n int = 2

insert @problem
      select 1 
union select 2

insert @question
      select 1, 1 
union select 2, 1
union select 3, 1
union select 4, 2

insert @answer 
      select 1, 1 
union select 2, 1
union select 3, 1
union select 4, 2
union select 5, 2
union select 6, 3
union select 7, 4
union select 8, 4

select p.id --, p.name, p.description, p.etc
from @problem p
where @n >= ALL --http://msdn.microsoft.com/en-us/library/ms178543.aspx
(
    select COUNT(a.id) 
    from @question q
    left outer join @answer a
        on q.id = a.question_id
    where p.id = q.problem_id
    group by q.id
)

注意:質問のスキーマがサンプルデータと一致しないため、テーブルスキーマは質問とは少し異なります。

(内部SQLを一時テーブルに移動した@RichardTheKiwiの回答に基づく)

declare @tempTable table (pid bigint, qid bigint, aidCount bigint)

insert @tempTable
select q.problem_id, q.id, count(a.id) answercount
from @question q
left join @answer a on a.question_id = q.id
group by q.problem_id, q.id

select pid
from @tempTable
group by pid 
having min(aidCount) >= @n 
于 2012-10-25T00:46:07.207 に答える
1

相関サブクエリとして書き換えます。すべての質問で少なくともN個の回答がある問題を見つける代わりに、N個未満の回答で質問がない問題を見つけます。

SELECT id AS problem_id
FROM problem AS p 
WHERE NOT EXISTS
      ( SELECT 1
        FROM question AS q
          LEFT JOIN answer AS a 
            ON a.question_id = q.id
        WHERE q.problem_id = p.id
        GROUP BY q.id
        HAVING COUNT(a.question_id) < 2
      ) ;
于 2012-10-25T22:06:29.583 に答える