我想找到不同的问题对,但在某种程度上,每个问题在所有结果对中最多重复几次(例如5次并不重要)。
我有一个问题表,并且由笛卡尔积的产物本身在第一个位置的每个问题至少重复所有其他问题。
我怎样才能限制结果,找到每个问题重复几次的问题对?
主表是这样的:
id question
1 q1
2 q2
3 q3
4 q4
用我实现的笛卡儿积算
id1 question1 id2 question2
1 q1 2 q2
1 q1 3 q3
1 q1 4 q4
.
.
.
但我只想要
id1 question1 id2 question2
1 q1 2 q2
3 q3 4 q4
(q1不再重复)
提前致谢
答案 0 :(得分:0)
如果Id是继续序列(无孔),您可以将一个偶数ID与一个奇数ID配对。
SELECT *
FROM question Q1
JOIN question Q2
ON Q1.ID = Q2.ID -1
WHERE
Q1.ID % 2 <> 0
现在,如果问题的数量是奇数,你可以添加一个附加标准,例如最后一个问题与第一个问题。
UNION
SELECT *
FROM question Q1
JOIN question Q2
WHERE
Q1.ID = 1
AND Q2.ID = (SELECT max(ID) FROM questions)
答案 1 :(得分:0)
您需要少量随机问题对,比N ** 2小得多。计算笛卡尔十字产品,随机改组,并产生前几行。
select * from crossproduct order by sha1(qid1 + ',' + qid2) limit 10;
假设此设置:
drop table if exists posts;
create table posts (
id integer primary key auto_increment,
body varchar(80)
);
drop view if exists crossproduct;
create view crossproduct as
select p1.id as qid1, p1.body as question1,
p2.Id as qid2, p2.Body as question2
from posts p1, posts p2
where p1.id != p2.id
;
要重新随机播放,请使用sha1(qid1 + ', 1,' + qid2)
或, 2,
,....