2017-02-23 12 views
1

У меня есть «матрица» таблицу со следующими столбцами заполненными.Можно ли прокручивать строки таблицы mysql и проверять столбцы?

matrix_id, user_id, position_1, position_2, position_3 
    1   1  1982  2251  5841 
    2   2  6204   0   0 
    3   3   0   0   0 
    4   4   0   0   0 

Я в принципе хочу сделать следующее.

  1. Найти строку с наименьшим user_id и иметь пустую позицию.
  2. В приведенном выше примере это будет user_id 2 и position_2.
  3. Я обновляю строку с запросом.
  4. Затем я перехожу к следующей следующей пустой позиции. Поскольку user_id 2 все еще имеет пустую позицию_3, я снова обновляю строку запросом.
  5. Поскольку эта строка завершена, я перехожу к следующему наивысшему user_Id, который имеет пустые позиции. В этом случае это user_id 3, а затем user_id 4 после этого.

Я знаю, что могу сделать все вышеописанное, если знаю, что такое user_id. Но предположим, что в этом случае я не знаю, что такое user_id. Как тогда будут выглядеть запросы?

Вот что у меня есть.

$find_user = $db->prepare("SELECT * FROM matrix WHERE user_id > :user_id"); 
$find_user->bindValue(':user_id', 0); 
$find_user->execute(); 
$result_user = $find_user->fetchAll(PDO::FETCH_ASSOC); 
if(count($result_user) > 0) { 
    foreach($result_user as $row) { 
    $matrix_id    = $row['matrix_id']; 
    $user_id    = $row['user_id']; 
    $position_1    = $row['position_1']; 
    $position_2    = $row['position_2']; 
    $position_3    = $row['position_3']; 
    } 
} else { 
    $errors[] = 'User Id not found in Matrix.'; 
} 

$update_user = $db->prepare("UPDATE matrix SET position_2 = :position_2 WHERE user_id = :user_id"); 
$update_user->bindValue(':position_2', 1564; 
$update_user->bindParam(':user_id', $user_id); 
if($update_user->execute()) {} 
+0

Что вы считаете EMPTY быть? '' '' или 'NULL' или что еще? – RiggsFolly

+0

Я считаю, что пустым является «0». Вот как выглядит таблица. Все пустые позиции отображаются автоматически как 0. Я должен обновить свою оригинальную таблицу, чтобы это не сбивало с толку. – tom

+0

Сделать все новые значения равными '1564' – RiggsFolly

ответ

1

Это должно пройти через всех ваших пользователей от наименьшего user_id до самого большого.

Для каждого пользователя он проверяет соответствующие столбцы и применяет новое значение к пустым.

$new_val = 1999; 

$result = $db->query("SELECT * FROM matrix ORDER BY user_id"); 
$users = $result->fetchAll(PDO::FETCH_ASSOC); 
if(count($users) > 0) { 

    // prepare all the possible queries 
    // make use of prepare once execute many times 
    $stmt1 = $db->prepare("UPDATE `matrix` SET `position_1` = :pos WHERE `user_id` = :id"); 
    $stmt2 = $db->prepare("UPDATE `matrix` SET `position_2` = :pos WHERE `user_id` = :id"); 
    $stmt3 = $db->prepare("UPDATE `matrix` SET `position_3` = :pos WHERE `user_id` = :id"); 

    foreach($users as $user) { 
     if ($user['$position_1'] == 0) { 
      $stmt1->execute(array(':pos'=>++$new_val,':id'=>$user['user_id'])); 
     } 
     if ($user['$position_2'] == 0) { 
      $stmt1->execute(array(':pos'=>++$new_val,':id'=>$user['user_id'])); 

     } 
     if ($user['$position_3'] == 0) { 
      $stmt1->execute(array(':pos'=>++$new_val,':id'=>$user['user_id'])); 
     } 
    } 
} else { 
    $errors[] = 'User Id not found in Matrix.'; 
} 

Вы можете ограничить количество строк для обработки путем изменения в запросе немного, чтобы только найти пользователей с колоннами, чтобы исправить

$result = $db->query("SELECT * 
        FROM matrix 
        WHERE position_1 = 0 
         OR position_2 = 0 
         OR position_3 = 0 
        ORDER BY user_id"); 
+0

Это замечательно. Я сделаю снимок с моим оригинальным кодом. Огромное спасибо. – tom

+0

Итак, я попробовал ваш код выше. Кажется, я получаю сообщение об ошибке «Идентификатор пользователя не найден в матрице».Поэтому кажется, что «$ result-> num_rows> 0» не возвращает никаких записей. Вы уверены, что запрос «Результат» верен? Если нужно найти количество строк, то не могли бы вы использовать «COUNT (*)» в запросе? Дай мне знать. Благодарю. – tom

+0

Привет, я основывал свой ответ на вашем вопросе. В основном этот бит 'SELECT * FROM matrix WHERE user_id>: user_id', так что если' user_id' не существует, то что он называется – RiggsFolly

0

важная вещь здесь, является то, что вы работаете с рядом, а не столбцы поэтому проверьте все предпосылки и обновления строки.

$find_user = $db->prepare("SELECT * FROM matrix order by user_id asc"); 
$find_user->execute(); 
$result_user = $find_user->fetchAll(PDO::FETCH_ASSOC); 
    foreach($result_user as $row) { 
    $matrix_id = $row['matrix_id']; 
    $user_id = $row['user_id']; 
    $position_1 = $row['position_1']; 
    $position_2 = $row['position_2']; 
    $position_3 = $row['position_3']; 
    } 
$str = '' 
if (!$position_2){ 
    $str = "position_2 = :position_2" 
} else if (!$position_2 && !$position_3){ 
    $str = "position_2 = :position_2 and position_3 = :position_3" 
}  


$update_user = $db->prepare("UPDATE matrix SET " . $str . " WHERE user_id = :user_id"); 
$update_user->bindValue(':position_2', 1564); 
$update_user->bindValue(':position_3', 1564); 
$update_user->bindParam(':user_id', $user_id); 
if($update_user->execute()) {} 

Кроме того, получите все строки в таблице матриц, упорядоченные с помощью used_id, и обработайте каждую строку, в зависимости от вашего состояния.

+1

Я думаю 'asc' не' desc' – RiggsFolly

+1

'$ srt' =/=' $ str' – RiggsFolly

+0

Что относительно пустого 'position_1' – RiggsFolly