4

更新と回答の感謝と@ypercubeへのクレジット

答えは以下にあり、PHPに表示されるように自由に投稿しました。ヘルパーがあり、PDOを使用しています

    INSERT INTO `users_relationship` (`profile_1_id`, `profile_2_id` ,`request_date`,`auth_token`,`status`, `updated`, `deleted`)
    VALUES
        (:uid, :fid, '$now', '$fToken', 0, '$now',0),
        (:fid, :uid, '$now', '$fToken', 0, '$now',0)
    ON DUPLICATE KEY UPDATE request_date = VALUES(request_date), auth_token = VALUES(auth_token), updated = VALUES(updated), deleted = VALUES (deleted);

私は困惑しているMySQLクエリを持っています.一度にテーブル内の行を作成する必要があるという要件がありますが、これらの行がすでに存在する可能性があるため、この行のいくつかの列を更新する必要があります.重複を挿入するのではなく。

Justin (2) は Ben (5) と関係があります。この関係は、profile_1_id が 2 または 5 であるデータベースの行を更新し、削除された列にフラグを挿入することによって終了します。その後、ベンは関係を再燃させようとするため、行を再度更新し、削除されたフラグを削除して、request_date、auth_token を更新し、新しい値で更新する必要があります。

私は次のように書いていますが、エラーが発生していません:

重複する列名 '2012-09-05 10:13:06'

INSERT INTO `users_relationship` (`profile_1_id`, `profile_2_id`,`request_date`,`auth_token`,`status`, `updated`, `deleted`)
    SELECT * FROM 
        (SELECT 2, 5, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0) AS faTmp,
        (SELECT 5, 2, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0) AS fTmp
    WHERE NOT EXISTS 
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=2 AND `profile_2_id` =5) OR 
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=5 AND `profile_2_id` =2) LIMIT 1

私は正しい道を進んでいますか、それともこれを行うためのより良い方法はありますか?

ありがとう

ジャスティン

4

2 に答える 2

6

最良の方法は、UNIQUE制約を追加して(profile_1_id, profile_2_id)から使用することです。

INSERT INTO `users_relationship` 
  (`profile_1_id`, `profile_2_id`
  ,`request_date`,`auth_token`,`status`, `updated`, `deleted`)
VALUES
  (2, 5, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0),
  (5, 2, '2012-09-05 10:13:06', 'SQLTEST', 0, '2012-09-05 10:13:06', 0) 
ON DUPLICATE KEY UPDATE
  request_date = VALUES(request_date)          --- what you want to happen
, auth_token = VALUES(auth_token)              --- when rows exist
  --- ; 
于 2012-09-05T10:06:58.640 に答える
1

このようにできますが、構文は

 WHERE NOT EXISTS  
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=2 AND `profile_2_id` =5) 
 AND  
 NOT EXISTS  
        (SELECT  * FROM `users_relationship`WHERE `profile_1_id`=5 AND `profile_2_id` =2)
于 2012-09-05T10:05:39.060 に答える