使用另一个表中的随机值更新MySQL表的最佳方法

时间:2011-06-07 10:58:14

标签: mysql

对于这个(伪代码)示例,我在MySQL中有两个表:

member { id, name }
names { name }

会员有100名成员,有10名。我想使用名称中的随机名称来更新成员表。到目前为止,我已经有了这个,但是,不确定是否有更好的方法来实现它。

UPDATE member SET name = (SELECT name FROM names ORDER BY RAND() LIMIT 1);

代码将从脚本执行,所以我希望避免使用函数等。

提前致谢。

2 个答案:

答案 0 :(得分:3)

您可以通过在名称表中添加id列并使用:

来避免按rand()排序
UPDATE member SET name = (SELECT name FROM names WHERE id=floor(1 + rand()*10 ) );

只有10个名字,结果不会快得多,但如果你想从一个更大的名字集中选择你会看到差异,因为rand()的排序开始效率很低而且你为每个人做了很多成员排。

更新: 看起来像rand()里面会产生不可预测的结果。 改为使用这个:

UPDATE member m1
JOIN ( select id, floor(1+rand()*10) as rnd from member ) m2 on m1.id=m2.id
JOIN names n on n.id = m2.rnd
SET m1.name=n.name

受影响的行数可能会有所不同,如果随机名称与表中已有的名称相匹配则不计入更新。

答案 1 :(得分:2)

试图改善piotrm的解决方案。似乎有效; - )

CREATE TABLE member (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE names (
  id INT(11) NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO member VALUES 
  (1, NULL),
  (2, NULL),
  (3, NULL),
  (4, NULL),
  (5, NULL),
  (6, NULL),
  (7, NULL),
  (8, NULL),
  (9, NULL),
  (10, NULL),
  (11, NULL),
  (12, NULL),
  (13, NULL),
  (14, NULL),
  (15, NULL);

INSERT INTO names VALUES 
  (1, 'text1'),
  (2, 'text2'),
  (3, 'text3'),
  (4, 'text4'),
  (5, 'text5'),
  (6, 'text6'),
  (7, 'text7'),
  (8, 'text8'),
  (9, 'text9'),
  (10, 'text10');

UPDATE
  member m1
  JOIN (SELECT id, @i:=FLOOR(1 + RAND() * 10), (SELECT name FROM names n WHERE n.id = @i) name FROM member) m2
    ON m1.id = m2.id
SET
  m1.name = m2.name;