PHP MySQL UPDATE连接表

时间:2016-06-18 22:43:14

标签: php mysql join sql-update

我已经看到有类似的问题,但它们似乎没有帮助......可能只是因为我没有正确理解并且能够将他们的例子转化为我的需求。任何帮助表示赞赏。

我正在尝试将$ _POST表单上的输入字段转换为我的用户表,特别是管理器密钥,从管理器名称(在表单中)到管理员ID(在DB中)。让我举个例子。

我们的数据库(在其他表中)包含用户表和管理员名称。经理人表只有经理的身份证,第一和第一。姓。 users表具有自己的id,first_name,last_name和关联的manager id。这是它的外观:

MANAGERS
id  first_name  last_name
1   John        Doe
2   Mary        Lewis

USERS
id  first_name  last_name   manager
1   Steve       Thompson    1

我已经为users表创建了一个编辑表单,其中从数据库输入了这些信息,但是我已经在SELECT语句中加入了两个表,因此它显示的是manager.id,而不是manager.first_name和forms.last_name在表单中。

所以我要做的是允许某人编辑与用户关联的经理,通过提交他们的名字而不是ID,但在数据库中它将其与ID相关联。我们有很多经理,所以大多数人都不知道他们在数据库中的ID是什么。但是,他们都知道他们的名字。因此可以使用SQL UPDATE查询来实现:

正如您所看到的,用户Steve Thompson有经理1(John Doe),但该用户的经理需要更改为Mary Lewis。如何在“用户编辑表单”中输入名称“Mary Lewis”,并使用管理员的名称而不是管理员的ID更新数据库表。

我见过有人说你不能在一个查询中更新多个表,但我觉得这有点不同,因为它更像是一个JOIN,但我不确定如何去做。有人知道这是否可行?

修改 我已经看过这个,觉得它可能会有所帮助......但不确定如何正确实现。也许这可以帮助某人? Update one MySQL table with values from another

1 个答案:

答案 0 :(得分:1)

在您设法解析经理名称并将其拆分为姓名后,您只需在子选择中选择经理id

update USERS set
  first_name = :user_first_name,
  last_name  = :user_last_name,
  manager = (
    select id
    from MANAGERS
    where first_name = :manager_first_name
      and last_name  = :manager_last_name
)
where id = :user_id

你也可以使用(CROSS)JOIN:

update USERS u
cross join MANAGERS m
set
  u.first_name = :user_first_name,
  u.last_name  = :user_last_name,
  u.manager    = m.id,
where u.id = :user_id
  and m.first_name = :manager_first_name
  and m.last_name  = :manager_last_name

请注意,如果经理名称不唯一,则无效。如果没有具有该名称的经理,它也将无效。

但是我可能会使用经理id作为值的下拉选项。您仍然可以显示名字和姓氏:

<select name="manager">
  <option value="1">John Doe</option>
  <option value="2">Mary Lewis</option>
</select>

这样您就会显示名称,但会在提交时获取ID。