MySQL插入仅在两个表中不存在的情况下

时间:2015-03-15 21:46:13

标签: php jquery mysql sql mysqli

我的MySQL查询有点问题。我正在使用PDO查询,现在只需将值插入表中(见下文):

$stmt = $dbh -> prepare("INSERT INTO tmp (user_id, test_id, question_id, answer_id) VALUES (?, ?, ?, ?)");
$stmt -> bindParam(1, $_SESSION['UserID']); // binds parameter for user id
$stmt -> bindParam(2, $_GET['start_test']); // binds parameter for test id
$stmt -> bindParam(3, $_POST['question']); // binds parameter for selected answer
$stmt -> bindParam(4, $_POST['select_answer']); // binds parameter for selected answer
$stmt -> execute();

tmp表结构如下:

CREATE TABLE IF NOT EXISTS `tmp` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `test_id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `question_id` int(11) NOT NULL,
  `answer_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
)

我想插入answer_id值,如果它不在那里并同时检查user_id,否则只是更新,例如:

我有两个user_id = 1和user_id = 2的用户,他们正在回答问题并且每个学生的每个答案都单独存储。 User_id = 1选择answer_id = 3而user_id = 2选择了answer_id = 3.然而,一个用户意识到这是一个错误的答案,并希望将其更改为另一个(假设answer_id = 2),我希望查询更新当前answer_id = 3 WHERE user_id = 1 to answer_id = 2

3 个答案:

答案 0 :(得分:2)

你可以为INSERT IGNORE创建一个{{1}},它看起来更简单,并且在某些问题上会是原子的。

步骤就像

  1. 在(user_id,question_id,answer_id)

    上创建唯一索引

    ALTER TABLE tmp add index user_qn_ans_idx(user_id,question_id,answer_id);

  2. 现在只需执行插入操作,也可能重复更新密钥

    INSERT INTO tmp(user_id,question_id,answer_id)值 (,) ON DUPLICATE KEY UPDATE answer_id = VALUES(answer_id)

答案 1 :(得分:0)

添加选择计数并执行以下条件:

$stmt = $dbh->prepare("SELECT count( 1 ) FROM tmp WHERE user_id = :user_id AND question_id = :question_id and answer_id = :answer_id");
$stmt->bindValue( 'user_id', 1 );
$stmt->bindValue( 'question_id', 1 );
$stmt->bindValue( 'answer', 1 );
$stmt->execute();
$oExists = $stmt ->fetch();
if( !empty( $oExists ) )
{
// Run update sql...
}
else
{
// Run insert sql...

答案 2 :(得分:0)

$stmt = $dbh->prepare("SELECT count( 1 ) FROM tmp WHERE user_id = :user_id AND question_id = :question_id AND answer_id = :answer_id");
$stmt->bindValue( 'user_id', 1 );
$stmt->bindValue( 'question_id', 1 );
$stmt->bindValue( 'answer_id', 1 );
$stmt->execute();
$oExists = $stmt ->fetch();
	if( !empty( $oExists ) ) {
	 echo "update";
	$stmt = $dbh->prepare("UPDATE tmp SET answer_id = :answer_id WHERE user_id = {$_SESSION['UserID']} AND question_id = {$_POST['question']}"); //updates the counter each time test created                                 
	$stmt -> bindParam(':answer_id', $_POST['select_answer'], PDO::PARAM_INT);
	$stmt -> execute();
	} else {
	echo "insert";	
	$stmt = $dbh -> prepare("INSERT INTO tmp (user_id, test_id, question_id, answer_id) VALUES (?, ?, ?, ?)");
	$stmt -> bindParam(1, $_SESSION['UserID']); // binds parameter for user id
	$stmt -> bindParam(2, $_GET['start_test']); // binds parameter for test id
	$stmt -> bindParam(3, $_POST['question']); // binds parameter for selected answer
	$stmt -> bindParam(4, $_POST['select_answer']); // binds parameter for selected answer
	$stmt -> execute();
	}

以下是更新,但不是插入..