SQL:如何为每个对象选择有限重复的表对象对?

时间:2017-09-20 15:43:55

标签: mysql sql

我想找到不同的问题对,但在某种程度上,每个问题在所有结果对中最多重复几次(例如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不再重复)

提前致谢

2 个答案:

答案 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,,....