PDO Inert Into на дубликат ключа с условием не работает - PullRequest
0 голосов
/ 10 ноября 2018

Все работает отлично, за исключением того, что я должен проверять, обновлять только существующую запись, если оценка базы данных <новая оценка. Когда я добавляю ГДЕ оценку <: оценка ', я получаю проблемы. Как добавить условие, чтобы проверить, что оценка базы данных меньше новой оценки? </p>

try {
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $conn->prepare('INSERT INTO UserTable (fb_id, level, score, star, timestamp) ' .
    'VALUES(:fb_id, :level, :score, :star, :timestamp)' .
    'ON DUPLICATE KEY UPDATE score= :score, timestamp= :timestamp WHERE score < :score');
    //WHERE score < $score
    $stmt->bindParam(':fb_id', $fb_id);
    $stmt->bindParam(':level', $level);
    $stmt->bindParam(':score', $score);
    $stmt->bindParam(':star', $star);
    $stmt->bindParam(':timestamp', $current_time);
    $stmt->execute();
    echo "New record created successfully";
}
catch(PDOException $e)
      {
        echo $sql . "<br>" . $e->getMessage();
      }
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Это то, что вы хотите?

INSERT INTO UserTable (fb_id, level, score, star, timestamp) ' .
     VALUES(:fb_id, :level, :score, :star, :timestamp)' .
     ON DUPLICATE KEY UPDATE
         score = GREATEST(:score, score),
         timestamp = (CASE WHEN :score > score THEN :timestamp ELSE timestamp END);
0 голосов
/ 10 ноября 2018

Я думаю, что это должно работать.Чем больше существующее и новое значение используется для обновления.В функции MAX() score относится к существующему значению, а VALUES(score) относится к новому значению.

$stmt = $conn->prepare('INSERT INTO UserTable (fb_id, level, score, star, timestamp) ' .
'VALUES(:fb_id, :level, :score, :star, :timestamp)' .
'ON DUPLICATE KEY UPDATE score = GREATEST(score, VALUES(score)), timestamp= :timestamp');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...