是否可以遍历mysql表行并检查列?

时间:2017-02-23 00:26:59

标签: php mysql database loops

我有一个“矩阵”表,其中填写了以下列。

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仍然具有空position_3,因此我再次使用查询更新该行。
  5. 由于该行已完成,我将继续查看具有空位置的下一个最高user_Id。在这种情况下,它是user_id 3,然后是user_id 4之后的那个。
  6. 我知道如果我知道user_id是什么,我可以完成上述所有操作。但假设在这种情况下,我不知道user_ids是什么。那么查询会如何?

    这是我到目前为止所拥有的。

    $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()) {}
    

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:0)

重要的是,你在使用行而不是列 所以检查所有先决条件并更新行。

IntPtr handle = FindWindowByCaption(IntPtr.Zero, dialogTitle));
SetForegroundWindow(handle);
SendKeys.SendWait("{HOME}");
SendKeys.Flush();

此外,获取由used_id排序的矩阵表中的所有行并处理每一行,具体取决于您的条件。