【问题标题】:Assigning one-column subquery to column将一列子查询分配给列
【发布时间】:2018-07-21 06:52:54
【问题描述】:

所以我有一个表,其中包含一个主键 id 和一个指向 id 的外键 target_id。我要做的是将每个target_id 设置为随机id,这不是它本身。

目前,这就是我获得随机 id 的方式:

SELECT id FROM (SELECT id FROM test) AS sub ORDER BY RAND()

但是,当我尝试将随机 id 的子查询分配给列 target_id 时,会抛出一个错误,指出子查询返回多行。

但是,当我尝试时

UPDATE SET `target_id` = `id` 

查看列是否可以直接复制,它起作用了,表明这是可能的。但是为什么我的子查询的一列不能复制到我的表的一列中呢?

对不起,如果我的问题措辞很奇怪;我对 MySql 不是很有经验:/

谢谢! :D

【问题讨论】:

标签: mysql


【解决方案1】:

正如您可能从 the link 在我对您的问题的评论中猜到的那样 - 我当时没有时间进一步解释...... - 我认为您实际上想要的是洗牌target_id 列的值左右。在 Mysql 中,这似乎是一项不平凡的任务,正如我的评论中的 the post 所示。

我还进行了一些进一步的尝试,并使用用户定义的变量想出了这个“主题的变体”。我第一次尝试使用临时表,但只能引用一次,所以最后我不得不恢复使用“常规”表tmp

drop table if exists tmp;
select @n:=0;select @m:=0;
create table tmp select * from
  (select *,@n:=@n+1 nr 
   from (select id,@m:=@m+1 n from tbl order by rand()) rnd 
   order by rand()
  ) rnd ; 

update tbl s 
  inner join tmp a on a.id=s.id
  inner join tmp b on b.nr=a.n
  inner join tbl t on t.id=b.id
set t.target_id=s.target_id;

在这里查看小演示:http://rextester.com/XYF73480

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2012-11-06
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多