1

私は次の表を持っています

CREATE  TABLE IF NOT EXISTS `friends` (
  `userid` INT NOT NULL ,
  `friend` INT NOT NULL ,
  `status` INT(1) NOT NULL ,
  INDEX `user_id_fk_idx` (`userid` ASC) ,
  INDEX `friend_id_fk_idx` (`friend` ASC) ,
  PRIMARY KEY (`userid`, `friend`) ,
  CONSTRAINT `user_id_fk`
    FOREIGN KEY (`userid` )
    REFERENCES `network`.`users` (`userid` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `friend_id_fk`
    FOREIGN KEY (`friend` )
    REFERENCES `network`.`users` (`userid` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

このテーブルに新しいタプルを挿入したい場合、そのタプルが既に存在するかどうかを確認したい。

例: テーブルに (1,2,0) を挿入すると、(1,2, ) または (2,1, ) がテーブルに存在しない場合にのみ実行する必要があります。または、テーブルでタプル (1,2, ) を検索する場合、(1,2, ) と (2,1,*) を検索して結果を返す必要があります。

現在、このために 2 つのクエリを実行していますが、これを 1 つのクエリにまとめることができますか?

4

2 に答える 2

1

これを行う1つの方法は、ここで「双方向」の例に従うことです(かなり良いです)

複数の列に双方向の一意のインデックスを実装する方法

これを配置したら、次のいずれかを行うことができます

  1. SELECTし、何もない場合は新しいデータをINSERTします。

また

  1. データが既に存在するためにエラーがスローされた場合は、INSERTおよびキャッチ エラー。
于 2013-04-29T01:05:57.063 に答える
0

aあなたのユーザーIDのものであると言って、タプルのいずれかが存在する場合、そうでない場合b、これは与えられますTRUEFALSE

SELECT COUNT(*) > 0
FROM friends
WHERE
    (friends.userid = a AND friends.friend = b)
OR  (friends.userid = b AND friends.friend = a)

テーブルから双方向の関係を構築することもできます

SELECT friends.userid AS userid, friends.friend AS friend FROM friends
UNION ALL
SELECT friends.friend AS userid, friends.userid AS friend FROM friends

すべてを 1 つのクエリで実行する場合は、と組み合わせINSERTて使用​​する必要があります。実施例INSERT ... SELECTWHERE NOT EXISTSSELECT part

INSERT INTO friends (userid, friend)
SELECT a,b FROM dual
WHERE NOT EXISTS (
    SELECT friends.userid
    FROM friends
    WHERE
        (friends.userid = a AND friends.friend = b)
    OR  (friends.userid = b AND friends.friend = a)
)
于 2013-04-29T00:56:38.220 に答える