【问题标题】:Normalise data into one table将数据规范化到一张表中
【发布时间】:2013-03-16 15:20:22
【问题描述】:

我正在尝试从所有用户的表步骤中将行插入到表(用户步骤)中,前提是步骤 ID 不存在。

INSERT INTO userssteps
(status,user_id,step_id)
SELECT  
'0' , 
(SELECT DISTINCT id from users),
(SELECT DISTINCT id from steps)

我在上面的 MYSQL 上收到以下错误

#1242 - Subquery returns more than 1 row

原因: 新用户注册他们应该获得所有步骤,如果我创建一个新步骤,我想在 usersteps 中创建它以供当前用户查看。

如果有更聪明的方法可以做到这一点,我很想知道,但我很难过。我也在使用 cakePHP,所以如果有一种特殊的 cakePHP 方法可以帮助我,我会更喜欢那个。

表结构

steps:
id
name

users:
id
username
password

userssteps:
id
user_id
step_id
status

【问题讨论】:

  • steps 表上的user_id 列有什么用?

标签: mysql sql cakephp


【解决方案1】:

您似乎正在尝试生成笛卡尔积。 http://en.wikipedia.org/wiki/Cartesian_product.

如果用户和步骤表之间没有关系,则它们不能被连接,只能相乘。

INSERT INTO userssteps
(status,user_id,step_id) 
select 0,
users.id,
steps.id
from users
inner join steps

【讨论】:

    【解决方案2】:

    子查询(SELECT DISTINCT id from users)和(SELECT DISTINCT id from steps)将返回所有 id。在插入子句中,您只需要一个值(不能超过 1 个值)。 您可以尝试通过 ID 内部连接两个表

    【讨论】:

      【解决方案3】:

      试试这个方法:

      INSERT INTO userssteps
      (status,user_id,step_id) 
      
      select 0 as status,
      users.id,steps.id
      from users
      inner join steps
      on (users.id=steps.user_id);
      

      这种方式应该可行;)

      PS:现在加入是对的。

      感谢。

      【讨论】:

      • 谢谢,看起来我们已经接近了,除了下面的查询返回零结果,因此没有插入任何内容。目前三行分步存在,我有 2 个用户。所以我希望 userssteps 表中存在六行。非常感谢!
      • 上面的表结构我也加了。
      猜你喜欢
      • 2011-03-27
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      相关资源
      最近更新 更多