ОБНОВЛЕНИЕ ВНУТРЕННЕГО СОЕДИНЕНИЯ - PullRequest
0 голосов
/ 24 июня 2011

У меня есть форма RSVP для свадьбы. У меня есть 2 таблицы (main и guest). Таблица 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 человек (основной гость, + 1-3 приглашенных гостя из таблицы guest. Я пытаюсь обновить всю их информацию одним «отправить»)

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Из форумов MySQL: Re: ОБНОВИТЬ несколько таблиц с помощью одного оператора UPDATE
Из справочника MySQL: 12.2.10.ОБНОВЛЕНИЕ Синтаксис

Я хотел бы предположить, что ваш 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'";

Выше, конечно, не будет работать для строк, которые на самом деле не существуют нагостевой стол - это ОБНОВЛЕНИЕ в конце концов.Предполагая, что у вас есть способ связать определенных гостей и их данные из представленных данных (может быть, их идентификатор или гостевая таблица?), Вы можете выполнять выборочные обновления через цикл, а затем добавлять операторы CASE к запросу, чтобы обновить все зарегистрированных гостей одновременно:

$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- переменные ($$ var) являются одним из способов достижения этого.Затем вы оставили бы операторы CASE, основанные на G.id, нетронутыми (конечно, также предполагая, что одно из них является ключевым полем, которое вы также обязательно должны были бы иметь в своих данных для уникальной идентификации строк дочерней таблицы).

Конечно, вам также нужно извлечь переменные, которые вы хотите использовать в цикле for, чтобы затем использовать их так, как я использовал в приведенном выше коде

Проще сделать, чем было сказано.

0 голосов
/ 24 июня 2011

Общий синтаксис запроса на обновление (для того, что вы пытаетесь сделать) похож на

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

Ваш запрос на обновление совсем немного.

0 голосов
/ 24 июня 2011

Если я понимаю ваш вопрос, вы хотите обновить все гостевые записи, где они соответствуют main.ID. Вы должны быть в состоянии сделать это без внутреннего соединения следующим образом:

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

Это обновит все гостевые записи, которые связаны с вашим основным идентификатором записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...