2012-10-24 63 views
4

我在PHP中运行以下MySQL查询。MySQL查询 - 连接两个表,产生重复结果

"SELECT * 
FROM `challenges`,`verifications` 
WHERE (`challenges`.`user_id`='".$this->record['id']."' OR `challenges`.`opponent_id`='".$this->record['id']."') 
    AND `challenges`.`is_verified`='0' 
    AND (`challenges`.`status`='in-progress' OR `challenges`.`status`='pending') 
    AND 
    (
     (`verifications`.`user_id`='".$this->record['id']."' OR `verifications`.`opponent_id`='".$this->record['id']."') 
     AND (`verifications`.`user_verified`!=NULL AND `verifications`.`opponent_verified`=NULL) 
    ) 
LIMIT 100"; 

此查询由于某种原因返回重复记录。如果有人有任何见解,我将不胜感激。

下面是两个表(挑战和验证)的结构:

挑战表:

CREATE TABLE `challenges` (
    `id` int(11) NOT NULL auto_increment, 
    `wager` int(11) NOT NULL, 
    `type` varchar(255) NOT NULL, 
    `user_id` int(11) NOT NULL, 
    `opponent_id` int(11) NOT NULL, 
    `start_date` date NOT NULL, 
    `date_created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
    `start_time` time NOT NULL, 
    `is_verified` tinyint(1) NOT NULL default '0', 
    `status` varchar(255) NOT NULL default 'pending', 
    `winner_id` int(11) default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0 ; 

考证表:

CREATE TABLE `verify` (
    `id` int(11) NOT NULL auto_increment, 
    `user_id` int(11) NOT NULL, 
    `opponent_id` int(11) NOT NULL, 
    `challenge_id` int(11) NOT NULL, 
    `user_verified` int(11) default NULL, 
    `opponent_verified` int(11) default NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `challenge_id` (`challenge_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=0; 

感谢您的帮助,如果你需要更多的信息,请让我知道。

+0

您应该避免使用'SELECT *'(使用列列表)并使用隐式联接,因为它们都是不好的练习。 – Kermit

+0

@njk你为什么认为'选择*'不好的做法? –

+0

该查询值得正确格式化。 –

回答

4

您必须添加条件:

challenges.id = verify.challenge_id 

where子句如下

"SELECT * 
FROM `challenges`,`verifications` 
WHERE `challenges`.`id` = `verify`.`challenge_id` 
AND (`challenges`.`user_id`='".$this->record['id']."' 
     OR `challenges`.`opponent_id`='".$this->record['id']."') 
AND `challenges`.`is_verified`='0' 
AND (`challenges`.`status`='in-progress' OR `challenges`.`status`='pending') 
AND ((`verifications`.`user_id`='".$this->record['id']."' 
     OR `verifications`.`opponent_id`='".$this->record['id']."') 
     AND (`verifications`.`user_verified`!=NULL 
       AND `verifications`.`opponent_verified`=NULL) 
    ) 
LIMIT 100"; 

或使用ANSI-92

"SELECT * 
FROM `challenges` as `challenges` 
JOIN `verifications` as `verifications` on `challenges`.`id` = `verify`.`challenge_id`  
WHERE (`challenges`.`user_id`='".$this->record['id']."' OR `challenges`.`opponent_id`='".$this->record['id']."') 
     AND `challenges`.`is_verified`='0' 
     AND (`challenges`.`status`='in-progress' OR `challenges`.`status`='pending') 
     AND 
     (
      (`verifications`.`user_id`='".$this->record['id']."' OR `verifications`.`opponent_id`='".$this->record['id']."') 
      AND (`verifications`.`user_verified`!=NULL AND `verifications`.`opponent_verified`=NULL) 
     ) 
     LIMIT 100"; 
+0

如果您要添加条件,为什么不将查询转换为使用ANSI JOIN语法而不是逗号? – Taryn

+0

@bluefeet为什么不能:)?谢谢我编辑了这篇文章。 – Parado

+0

使用ANSI标准+1。 – Kermit