INNER JOIN的更新

时间:2011-06-24 02:12:53

标签: mysql sql sql-update

我有一份RSVP表格用于婚礼。我有2个表(mainguest)。表main具有主要访客,表guest具有该方中包含的关联访客。我可以使用INNER JOIN来提取它们,但无法使用相同的提交UPDATE它们。

我的表格设置如下:

main

id | firstName | lastName | meal | rsvp

guest

id | guestFirstName | guestLastName | guestMeal | guestRsvp | mainID

我的更新是这样写的:

$$updateGuests = "UPDATE guest.id 
                     SET guestMeal = '$guestMeal', 
                         guestNotes = '$guestNotes', 
                         guestAccept = '$guestAccept' 
                   WHERE guest.mainID = '$id'";
mysql_query($updateGuests);

有些聚会将超过2人(主要客人,来自guest表的+1位相关客人。我正在尝试使用“提交”更新所有信息

3 个答案:

答案 0 :(得分:1)

来自MySQL论坛:Re: UPDATE multiple tables with one UPDATE statement
来自MySQL参考:12.2.10. UPDATE Syntax

我认为你的PHP代码是

$updateGuests = 
    "UPDATE 
         main M LEFT JOIN guest G ON M.id = G.mainID
     SET 
         G.guestMeal = '$guestMeal', 
         G.guestNotes = '$guestNotes', 
         G.guestAccept = '$guestAccept',
         M.meal = '$something'
     WHERE G.mainID = '$id'";

当然,上面的内容对于guest表上实际不存在的行不起作用 - 毕竟它是UPDATE。假设您有办法从提交的数据(可能是他们的id或来宾表?)中链接特定访客及其数据,您可以通过循环执行选择性更新,然后将CASE语句附加到查询以更新所有< em>注册嘉宾:

$sql = 
    "UPDATE 
        main M LEFT JOIN guests G ON M.id = G.mainID
    SET
        M.meal = '$something'
        ";

for ($i=0; $i < count($yourArrayHere); $i++) { 
    /* ... code to extract values from array here ...*/
    $sql .= 
    ", G.guestMeal = CASE G.id WHEN '$guestID' THEN '$guestMeal' END
    ";
}

$sql .= "WHERE M.id = '$id'";

以上内容是基于您需要使用某些数据更新 main 表的假设而编写的。因为它每次逻辑上都是一行,所以它显示在查询的顶部。循环中的部分是静态的 - 因此,如果在提交数据中始终有一组严格的填充字段,则只需添加类似的字段。如果不是这样,您可能希望通过添加将表单字段名称转换为数据库字段名称然后通常修改字符串以附加到目标字段和源变量上的$ base sql语句来使其更加灵活。 - 变量变量($$ var)是实现此目的的一种方法。然后,您将保留基于G.id的CASE语句不变(当然,还假设您的数据也是强制在您的数据上可用的唯一标识子表行的关键字段)。

当然你还需要在for循环中提取你想要的变量,然后像我在上面的代码中使用的那样使用它们

比说起来容易。

答案 1 :(得分:0)

如果我理解您的问题,您希望更新与main.ID匹配的所有访客记录。您应该能够在没有内部联接的情况下执行此操作,如下所示:

UPDATE guest   
  SET guestMeal ='$guestMeal', guestNotes = '$guestNotes', 
      guestAccept = '$guestAccept' 
  WHERE guest.mainID ='$id'

这将更新链接到您的主记录ID的所有访客记录。

答案 2 :(得分:0)

一般更新查询语法(针对您要执行的操作)类似于

UPDATE [table-name]
   SET field-name1 = value1,
   SET field-name2 = value2,
   SET field-name3 = value3
   WHERE some-condition

您的更新查询只是一点点。