2013-04-29 18 views
1

我有如下表如何搜索一個元組中的表中的MySQL

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,*)並返回結果。

目前我正在爲此運行兩個查詢,這可以結合在一個查詢中嗎?

回答

0

ab是你的用戶標識的,那麼這會給TRUE如果任一元組的存在,FALSE如果不是

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 

如果您想要在一個INSERT查詢中完成所有操作,則需要在SELECT part中使用INSERT ... SELECT加上WHERE NOT EXISTS。要做到這一點Working example

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) 
) 
+0

你能告訴我更多關於雙向關係嗎? – unkn0wn 2013-04-29 01:00:57

+0

如何在插入時實現這樣的事情? – unkn0wn 2013-04-29 01:01:30

+0

@ user2207792查看更新的答案 – dtech 2013-04-29 01:11:30