2017-02-14 12 views
0

У меня есть переменная в $ _POST, которая выглядит следующим образом:Использование распределительной таблицы с повторяющимися идентификаторами, вызывающих confusiont с запросом SQL в цикле PHP Еогеасп

[genre_id] => Array 
    (
     [0] => 1 
     [1] => 3 
    ) 

У меня есть блок PHP кода:

foreach ($_POST["genre_id"] as $key => $value) { 
    $genre_query = "UPDATE books_genres SET genre_id = $value WHERE book_id = $book_id"; 
    $genre_result = mysqli_query($connection, $genre_query); 
    if ($genre_result && mysqli_affected_rows($connection) >= 0) { 
    echo("Genre Update: Sucess<br>"); 
    } else { 
    echo("Genre Update: Fail<br>"); 
    } 
} 

Стол под названием books_genres представляет собой соединительную таблицу из-за многих отношений. Это означает, что некоторые из $book_id будут дублированы. Что явно происходит, так это то, что каждая строка с указанным book_id обновляется каждый раз.
Должен ли я иметь другую колонку в моей таблице books_genres? Даже тогда я не уверен, как я буду ссылаться на этот индекс? Или я должен каким-то образом писать запрос?

+0

Обычно вы не обновляете соединительную таблицу. Вы удаляете старые значения и вставляете новые. Если вы хотите сделать этот тип обновления, вам нужно будет включить «старый» genre_id в качестве дополнительного предиката в свой оператор where, чтобы он знал, какой genre_id вы хотите обновить. –

+0

@sean_lange, поэтому я бы обновил как таблицы книг, так и жанры, каждый из которых имеет код, который обновляет таблицу books_genres отдельно? Я понимаю, что вы говорите, более стандартно? –

+0

№ Пункт точки соединения состоит в том, что вам ничего не нужно обновлять. У него есть ключ от обеих таблиц? Ключ не меняется в вашей таблице? Если вы не денормализовали свои структуры, вам действительно не нужно обновлять таблицы соединений, за исключением редких сценариев. Если данная книга была классифицирована как «классическая», а затем переклассифицирована как «ужас», вы удаляете классическую запись и вставляете запись ужаса. Возможно, объяснение этого объясняло бы ddl и некоторые примеры данных. –

ответ

0

Точка соединения - это то, что вам ничего не нужно обновлять. У него есть ключ от обеих таблиц? Ключ не меняется в вашей таблице? Если вы не денормализовали свои структуры, вам действительно не нужно обновлять таблицы соединений, за исключением редких сценариев. Если данная книга была классифицирована как «классическая», а затем переклассифицирована как «ужас», вы удаляете классическую запись и вставляете запись ужаса. Возможно, объяснение этого объясняло бы ddl и некоторые примеры данных.

0

Что явно происходит, так это то, что каждая строка с указанным book_id обновляется каждый раз.

Но это именно то, что вы просили MySQL-движок!

Пожалуйста, помните, что SQL является декларативным языком, а не обязательным. Итак, вместо того, чтобы показывать код, объявите ваши намерения!

Сообщите нам и нам, что вы собираетесь обновлять.

Другими словами, определите набор записей, который должен нажать «обновление». После этого вы легко получите предложение «где», необходимое для сужения операции.