在mysql中,以随机顺序从2个表中选择2条不同的记录

在mysql中,以随机顺序从2个表中选择2条不同的记录,mysql,Mysql,我的问题如下: SELECT tb1.id, tb2.id FROM tb1 JOIN tb2 ON tb1.group = tb2.id WHERE tb1.status = 1 AND tb2.status = 1 GROUP BY tb1.group ORDER BY RAND( ) LIMIT 2 这两个表在1000行以下都很小,所以按兰德排序就可以了 对于tb2中的每条记录,tb1中有10条记录通过tb2.id=tb1.group链接。我想选择两个不同的组,每组在tb1中随机记

我的问题如下:

SELECT tb1.id, tb2.id 
FROM tb1
JOIN tb2 ON tb1.group = tb2.id
WHERE 
tb1.status = 1 AND tb2.status = 1
GROUP BY tb1.group
ORDER BY RAND( ) 
LIMIT 2
这两个表在1000行以下都很小,所以按兰德排序就可以了

对于tb2中的每条记录,tb1中有10条记录通过tb2.id=tb1.group链接。我想选择两个不同的组,每组在tb1中随机记录

让GROUPBY子句始终从tb1中选择组中的第一条记录。删除GROUPBY子句时,它会按照应该的方式随机选择一个。。。。但它可以每隔一段时间在同一组中选择两个项目


我如何从tb1中选择两个不同组中的两个随机记录?

不知何故,这似乎比我想象的要复杂,但我认为它符合您的要求:

select tb2.*,
       (select tb1.id from tb1 where tb1.group = tb2.id and tb1.status = 1 order by rand() limit 1) 
from tb2
where tb2.status = 1 and
      exists (select 1 from tb1 where tb1.status = 1 and tb1.group = tb2.id)
group by tb2.id
order by rand()
limit 2

我可能误解了你的要求,所以让我澄清一下我认为你的要求。。。 tb1中的2个随机记录分为2个不同的组。。。对于每个tb2记录,您需要从tb1表中获得两条随机记录。因此,如果tb2有100条记录,那么您希望结果集中有200条记录。。。第1组2人,第2组2人,第3组2人,等等

如果是这样的话,我只需要包装您的查询并利用MySQL变量,在每个组中放置一个计数器并应用HAVING子句

select
      AllPossible.group,
      @lastSeq := if( AllPossible.group = @lastGroup, @lastSeq +1, 1 ) as GroupSeq,
      @lastGroup = AllPossible.group
   from
      ( SELECT 
              tb1.id, 
              tb2.id 
           FROM 
              tb1
                 JOIN tb2
                    ON tb1.group = tb2.id
           WHERE 
                  tb1.status = 1 
              AND tb2.status = 1
           ORDER BY 
              tb1.group,
              RAND( ) ) AllPossible,
      ( select @lastGroup := 0,
               @lastSeq := 0 ) sqlvars
   having
      GroupSeq < 3;
由此,它按顺序分配一个组序列。由于RAND是首先应用的,并以随机顺序返回,因此它只会在记录1、2、3、4、下一组-1、2、3、4等上盖章。。。having子句最后声明,我只想要那些组序列小于3的组,因此每个组只保留1&2个,并从最终结果集中排除所有剩余部分

1     19      1     (keep)
1     95      2     (keep)
1     3       3     (throw away)
1     28      4     (throw away)

2     34      1     (keep)
2     14      2     (keep)
2     89      3     (throw away)
2     41      4     (throw away)

3     9       1     (keep)
3     25      2     (keep)
3     42      3     (throw away)
3     76      4     (throw away)