次の表を検討してください。
[Table: talks]
talkID | title | starred
-------+--------------+--------
1 | talk1-title | 1
2 | talk2-title | 1
3 | talk3-title | 0
4 | talk4-title | 0
5 | talk5-title | 0
[Table: talkspeaker]
talkID | speaker
-------+---------
1 | Speaker1
1 | Speaker2
2 | Speaker3
3 | Speaker4
3 | Speaker5
4 | Speaker6
5 | Speaker7
5 | Speaker8
[Table: similartalks]
talkID | similarTo
-------+----------
1 | 3
1 | 4
2 | 3
2 | 4
2 | 5
3 | 2
4 | 5
5 | 3
5 | 4
私がやりたいことは次のとおりです。スター付きトークのセットが与えられた場合、スターなしのトーク (スター付き = 0) の上位 2 つと、スター付きトークのセットに最も類似したタイトルとスピーカーを選択したいと思います。問題は、講演者を取得するには集計関数を使用する必要があり、最も類似した講演を取得する必要があることです。
論争にスピーカーがいなくても、次のクエリを使用して、最も類似した講演を得ることができました。
select t2.talkID, t2.title, count(*) as count
from similarTalks s, talks t1, talks t2
where s.talkID = t1.talkID
and t1.Starred = 1
and s.similarTo = t2.TalkID
and t2.Starred = 0
group by t2.title, t2.talkID
order by count desc
limit 2
一般的に、スピーカーを取得するために次の集計関数を使用し、適切なグループごとの列 (t = talkspeaker と仮定) を使用します。
group_concat(t.speaker, ', ') as Speakers
のように
select t1.title, group_concat(t2.speaker, ', ') as Speakers
from talks t1, talkspeaker t2
where t1.talkID = t2.talkID
group by t1.title
しかし、私は2つのことを一緒に組み合わせることができません。このクエリを sqlite データベースで実行することを計画していることが問題になる場合があります (これが group_concat 関数の由来です)。スター付きトークに最も類似したトップ 2 のスターなしトークへの回答は、talkID 3 と 4 のようです。