2013-05-31 73 views
0

我有一个表格,用户应该输入数据(名称,街道名,街道号),然后我想检查表中是否存在该数据(名称,街道名+街道号)所以我可以使用该行而不是制作一个新的。 有没有一种简单的方法来做到这一点,或者我将不得不将数据提取到数组中并以某种方式进行搜索?查找传入的数据是否存在于sql表中

我有这样的代码:

$sql = "INSERT INTO 725G54_proj_address VALUES   (NULL,'$streetname','$streetnumber')"; 
$result1 = mysql_query($sql,$con); 
$address=mysql_insert_id(); 
echo "ID of last inserted record is: " . $address; 
echo "<br>"; 


$sql = "INSERT INTO 725G54_proj_contact VALUES ('Null','$name','$telephonenumber')"; 
$result2 = mysql_query($sql,$con); 
$contact = mysql_insert_id(); 
echo "ID of last inserted record is: " . $contact; 


$sql = "INSERT INTO 725G54_proj_LivesAt VALUES ('$contact','$address')"; 
$result3 = mysql_query($sql,$con);`enter code here` 

什么,我想是是找出是否例如主街31 proj_address媒体链接存在,如果这样做,利用其自动递增的ID为插入到proj_Lives_at。

编辑: 我决定发送查询来检查数据是否存在。 我加载到一个变量,并检查它是否为空,但有一些问题,以便“如果(空)”不工作,因为它应该。另一种方式(“if(!empty)”)可以工作。

查询和加载看起来像这样:

$sql2="SELECT 725G54_proj_address.Address_ID, GROUP_CONCAT(cast(concat(725G54_proj_address.Street_Name, ' ', 725G54_proj_address.Street_Number) AS char) SEPARATOR ', ') AS addresses 
    FROM 725G54_proj_address 
    WHERE 725G54_proj_address.Street_Name = '$streetname' AND 725G54_proj_address.Street_Number= '$streetnumber' 
    GROUP BY 725G54_proj_address.Address_ID 
    ORDER BY 725G54_proj_address.Address_ID ASC"; 
$result2=mysql_query($sql2); 

编辑2: 我曾尝试切换到使用count(),而不是空的(),它作为发现即使当填充它不应该变。

+0

您将不得不读取该行,如果该行不存在,则将输入数据插入表中。 – suspectus

+0

您必须获取数据并进行比较。你还有什么比较? – user1

+0

@ user1我的意思是说,在sql中有一些方法可以做到这一点,或者如果我不得不把它拿到php并做到这一点。 –

回答

0

听起来您正在创建多对一的关系(可能),因此应该将这些数据存储在单独的查找表中。我在这种情况下建议首先尝试使用“INSERT IGNORE”语句 (http://dev.mysql.com/doc/refman/5.5/en/insert.html)插入该行,然后使用mysql_affected_rows()查看是否进行了更改。如果没有,那么你知道有一个重复的行,你可以选择,取得ID,然后你就完成了。

正如有人在上面的评论中提到的那样,您可以将其变为存储过程。

+0

对我来说这似乎相当倒退 - 为什么在使用'INSERT IGNORE'后,如果在失败时跟随SELECT,而不是使用'SELECT'打开并根据结果决定是否使用INSERT?特别是考虑到'INSERT IGNORE'就像任何'INSERT'一样,可能由于许多与独特密钥约束无关的原因而失败,似乎这样做为微妙和难以压缩的bug提供了令人不舒服的广泛范围,其中'SELECT'-then-INSERT'方法避免了。 –

+0

我想我正在使用你可能潜在的逻辑(并且在大多数情况下)避免做两个查询。不是一个选择是一个大问题。你可能就在那里,因为当谈到SQL时,我确实没有任何类型的大师......但是这种技术在过去对我来说很有用。 – dudewad

+0

在我们的应用程序中,我们使用存储过程来做类似于'IF NOT EXISTS(SELECT *)INSERT INTO'的事情。我想在技术上它仍然是第二次调用,但就代码而言,它只是一个。或者你可以包装它try..catch,如果有错误,那么它已经存在... – ahwm

0

假设你已经在你的表上创建了正确的密钥(即(姓名,街道名,街道号)或类似的唯一密钥),那么MySQL INSERT...ON DUPLICATE KEY UPDATE或可能的REPLACE INTO在这里可能会很有用。如果要插入的密钥已经存在于表格中,则前者会将您的INSERT声明转换为UPDATE,后者将作为常规INSERT除非密钥已经存在,在这种情况下,它将首先在之前存在的行DELETE新数据。

当然,这不完全是一个沉重的负担只是SELECT COUNT(*) AS n_existing FROM table WHERE...,然后在结果集中看行是否已经与您准备INSERT相同的密钥存在检查n_existing,有是一个争论从principle of least astonishment开始,在INSERT之前比SELECT更好,而不是使用任何其他将要维护您的代码的人遇到的深奥的SQL语句。尽管如此,如果您愿意,也可以选择。

相关问题