如何检查第1列是否有第2列的两个不同值

时间:2014-08-24 22:06:33

标签: php mysql database insert duplicates

我试图通过UNIQUE进行INSERT并且我遇到了问题,我想要知道的是我将如何做到这样使得A列始终是独一无二的,除非C列有两个不同的值然后它将插入到数据库是A列的第二行,其中C列是不同的。

a|b|c
-----
1|2|3
2|4|5
1|6|7

所以我目前正在使用这个sql表

CREATE TABLE `Player` (
`id` int(11) NOT NULL auto_increment,
`playername` varchar(255) NOT NULL,
`SteamID` varchar(255) NOT NULL UNIQUE,
`position` varchar(255) NOT NULL,
`lastlogin` varchar(255) NOT NULL,
`approved` varchar(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;

使用此查询

$sql1= "INSERT IGNORE INTO Player (playername, SteamID, position, lastlogin, approved) VALUES ('$name', '$id', '$position', '$lastlogin', '$approve')";

它插入了我想要的方式,因此每个SteamID只有1个,但如果相同的SteamID有两个位置值,它也不会插入。

编辑:

我所拥有的是一个xml文件,我根据xml文件中的数据加载并将数据插入到数据库中,我需要的是下面的内容。

$xml = simplexml_load_file("players.xml");
foreach($xml->children() as $player)
{
    $id = $player->attributes()->id;
    $profile = new SteamProfile($id);
    $name = mysql_real_escape_string($profile->getUsername());
    $lastlogin = $player->attributes()->lastlogin;
    $position = $player->lpblock->attributes()->pos;
    $sql1= "INSERT IGNORE INTO Player (playername, SteamID, position, lastlogin, approved) VALUES ('$name', '$id', '$position', '$lastlogin', '$approve')";
    if (!mysql_query($sql1,$connection))
    {
            die('Insert Error: ' . mysql_error());
    }
} 

因此读取xml文件,然后将文件中的数据插入到数据库中。有时xml文件将包含

<player id="76561197961716203" lastlogin="8/22/2014 10:49:28 PM">
        <acl id="76561197961543041"/>
        <acl id="76561197988417990"/>
        <lpblock pos="273,93,-102"/>
        <lpblock pos="1322,62,-1711"/>
    </player>

此时我需要为第二个<lpblock pos=

创建第二行

所以它目前正在插入

| 60 | SwordFish | 76561197961716203 | 273,93,-102 | 8/22/2014 10:49:28 PM |是| 2014-08-24 15:28:16 |

它应该插入

| 60 | SwordFish | 76561197961716203 | 273,93,-102 | 8/22/2014 10:49:28 PM |是| 2014-08-24 15:28:16 | | 61 | SwordFish | 76561197961716203 | 1322,62,-1711 | 8/22/2014 10:49:28 PM |是| 2014-08-24 15:28:16 |

2 个答案:

答案 0 :(得分:0)

我不确定您要实现的目标,但您可以根据您的SteamIDposition列中的列组合设置独特的约束:

CREATE TABLE `Player` (
`id` int(11) NOT NULL auto_increment,
`playername` varchar(255) NOT NULL,
`SteamID` varchar(255) NOT NULL,
`position` varchar(255) NOT NULL,
`lastlogin` varchar(255) NOT NULL,
`approved` varchar(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `unique_combination_of_two_fields` (`SteamID`,`position`)
) ENGINE=InnoDB;

答案 1 :(得分:0)

感谢您帮助Jeroen我做了这个以及它的工作。

foreach($player->children() as $lpblock) 
    {
        $position = $lpblock->attributes()->pos;
        if(!empty($position))
        {
            $sql1= "INSERT IGNORE INTO Player (playername, SteamID, position, lastlogin, approved) VALUES ('$name', '$id', '$position', '$lastlogin', '$approve')";
            if (!mysql_query($sql1,$connection))
            {
                die('Insert Error: ' . mysql_error());
            }
        }
    }

但是我想要插入所有SteamID,而不仅仅是那些设置了$ position的那些。当我拿出它并尝试添加正确的行时,还会添加另一行空白$位置,就好像没有SteamID那样空白。

if(!empty($position)){

    }