Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询接收来自3个表的随机组合时有点麻烦_Mysql_Join_Random_Limit - Fatal编程技术网

MySQL查询接收来自3个表的随机组合时有点麻烦

MySQL查询接收来自3个表的随机组合时有点麻烦,mysql,join,random,limit,Mysql,Join,Random,Limit,这是最初的问题: 好的,这是我的问题,我有两个 表,其中一个名为firstnames,另一个名为 其他命名的姓氏。我是什么 这里要做的就是找到100个 这些可能的组合 测试数据的名称。名字 表在单个表中有5494个条目 列,并且lastnames表 单个列中有88799个条目。这个 我唯一能回答的问题是 得出的一些结果是: SELECT * FROM (SELECT * FROM firstnames ORDER BY rand()) f LEFT JOIN (

这是最初的问题:

好的,这是我的问题,我有两个 表,其中一个名为firstnames,另一个名为 其他命名的姓氏。我是什么 这里要做的就是找到100个 这些可能的组合 测试数据的名称。名字 表在单个表中有5494个条目 列,并且lastnames表 单个列中有88799个条目。这个 我唯一能回答的问题是 得出的一些结果是:

SELECT * FROM
    (SELECT * FROM firstnames ORDER BY rand()) f
    LEFT JOIN
         (SELECT * FROM lastnames 
ORDER BY rand()) l ON 1=1 limit 10;    The problem with this code is
它选择1个名字并给出 每一个可能的姓氏。 虽然这是有道理的,但我会 将限制设置为500000000英寸 为了得到所有的组合 可能没有20个第一 姓名(我宁愿不杀我的朋友) 服务器)。然而,我只需要100 随机生成的项目 测试数据,我将无法 用这个密码。谁能 请给我一些建议

  • 以上问题已经回答,我需要对以下问题的建议。我只是提供一个背景
我想将另一个表加入名为status的混合。这个表在一列中有5个条目,每当我尝试将它连接到其他两个表时,它都会重复另外两个表,以便状态标记与它们中的每一个都匹配。我唯一获得轻微成功的是:

SELECT *
FROM ( SELECT firstnames FROM firstnames ORDER BY RAND( )  LIMIT 5 ) AS First
JOIN ( SELECT lastnames FROM lastnames ORDER BY RAND( )  LIMIT 5 ) as Last 
JOIN ( SELECT status FROM status ORDER BY RAND( ) LIMIT 1) AS Status ON 1=1;
虽然名字和姓氏在此查询中不重复,但每个名称只列出一个状态标记。非常感谢你们的帮助

我首先在两个表上添加一个(automunbered)id字段

然后我将编写一个存储过程:

  • 创建一个包含2个字段(firstid、lastid)的临时表
    randomid

  • 在两个字段中插入100行(或您需要的数字)随机整数,(从1到MAX(firstnames.id)插入第一个字段,从1到MAX(lastnames.id)插入第二个字段)

  • firstnames
    lastnames
    表加入到
    randomid

  • 放下临时表


把它放在头上怎么样:

SELECT f.name,l.name FROM lastnames l INNER JOIN firstnames f ON 1=1 ORDER BY rand() limit 100;

内部联接比左联接等更快?

我不知道状态表的作用,但这将为您提供随机名称:

select firstnames, lastnames
from (select firstnames from firstnames order by rand() limit 100) fn
cross join (select lastnames from lastnames order by rand() limit 100) ln
order by rand()
limit 100;

别名选择存在,因此查询在此生存期内返回-交叉连接中有10000行。。。可管理的如果没有它们,将有数以百万计的行-使用MySQL变量查询不会返回行计数,您应该能够通过以下方式完成。。。虽然没有明确测试,但这应该可以满足您的需求。你不能做一个简单的笛卡尔交叉连接,因为你知道它会得到第一个名字,然后用所有的姓氏连接,然后用所有的姓氏连接下一个名字

此查询使用MySQL变量。内部查询(预先输入各自的名字和姓氏)将预先查询随机的10个名字(或姓氏)。然后,将其连接到名序列(@fns)和姓序列(@lns)的@variable。由于两者都只有10条记录,并且每个记录都以其计数器为0开始,因此它们都将生成序列为1-10的记录,因此连接将位于序列上,其中每个保证值中只有一个发生。。。vs rand(),它返回一些浮点分数,在这些分数中,您永远无法保证一个表中的数字与另一个表中的数字匹配

select
      First10.FirstName,
      Last10.LastName,
      ( SELECT status FROM status ORDER BY RAND( ) LIMIT 1) AS Status
   from 
      ( select fn.FirstName,
               @fns := @fns + 1 as Sequence
           from
             ( select FirsName,
                  from FirstNames
                  order by rand() 
                  limit 10 ) fn,
             (select @fns := 0 ) vars
      ) First10

      JOIN

      ( select ln.LastName,
               @lns := @lns + 1 as Sequence
           from
              ( select LastName,
                   from LastNames
                   order by rand() 
                   limit 10 ) ln,
              (select @lns := 0 ) vars 
      ) Last10

      ON First10.Sequence = Last10.Sequence

这将解决身份问题:

SELECT
    First.firstnames firstname
    Last.lastnames lastname
    ( SELECT status FROM status ORDER BY RAND() LIMIT 1 ) status
FROM 
    ( SELECT firstnames FROM firstnames ORDER BY RAND()  LIMIT 5 ) First
    JOIN ( SELECT lastnames FROM lastnames ORDER BY RAND()  LIMIT 5 ) Last

这些表是否有
id
字段(主键)?否,它们没有。最初我确实在每张表上都有它们,但这造成了混乱。相关问题:查询从未返回,我已经找到了这部分问题的解决方案。我正在尝试将状态表连接到其他两个表中。将状态添加到此查询将比使用sub-select更简单。在执行
按兰德排序()之前,我将尝试在内存中创建两个表的
交叉连接。在本例中,这意味着500万行。我已经有了生成随机名称的解决方案,但我需要将状态表连接到其他两个。状态表旨在通过标记随机标记随机名称。活的,死的,等等。总共有5行。这对于我上一个问题所需要的原始查询要好得多。非常感谢你!但是,现在我需要将状态表添加到混合中。@ypercube,谢谢。。。我发现MySQL变量对于许多解决方案来说非常方便。。。并在S/O提供的各种复杂解决方案中使用;Juat add
JOIN(通过RAND()LIMIT 1从status ORDER中选择status)作为status
。然后所有100行都将具有相同的(随机)状态。@Michael,只需将其添加为字段级别选择(正如我更新了答案)就可以了,伙计们,你们帮了很多忙。我感谢你:)