MySQL查询接收来自3个表的随机组合时有点麻烦
这是最初的问题: 好的,这是我的问题,我有两个 表,其中一个名为firstnames,另一个名为 其他命名的姓氏。我是什么 这里要做的就是找到100个 这些可能的组合 测试数据的名称。名字 表在单个表中有5494个条目 列,并且lastnames表 单个列中有88799个条目。这个 我唯一能回答的问题是 得出的一些结果是: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 (
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
随机生成的项目
测试数据,我将无法
用这个密码。谁能
请给我一些建议
- 以上问题已经回答,我需要对以下问题的建议。我只是提供一个背景
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 addJOIN(通过RAND()LIMIT 1从status ORDER中选择status)作为status
。然后所有100行都将具有相同的(随机)状态。@Michael,只需将其添加为字段级别选择(正如我更新了答案)就可以了,伙计们,你们帮了很多忙。我感谢你:)