2016-01-20 31 views
1

我有一个问题,添加数据在MySQL表中。我创建了一个简单的通讯系统。系统添加发送电子邮件地址到任务表和它的检查之前,如果它已发送发送。但是每次添加重复的记录都是例如;我的电子邮件列表包含3000条记录,但表中显示了6000条记录Mysql添加重复的数据,尽管控制

这是我的表结构和查询;

订户表

ID subscriber_mail 
-------------------- 
1 [email protected] 
2 [email protected] 
3 [email protected] 
4 [email protected] 

任务表

ID subscriber_mail CID 
--------------------------- 
1 [email protected] 1 
2 [email protected] 1 
3 [email protected] 1 
4 [email protected] 1 

订户获取和记录

$query = " 
    SELECT 
      S.* 
    FROM 
      subscribers AS S 
      LEFT JOIN tasks AS T ON (T.CID=". CAMPAIGN_ID ." AND S.subscriber_mail=T.subscriber_mail) 
      LEFT JOIN unsubscribes AS U ON (U.CID=". CAMPAIGN_ID ." AND S.subscriber_mail=U.subscriber_mail) 
    WHERE 
       (T.subscriber_mail IS NULL) 
      AND (U.subscriber_mail IS NULL) 

    "; 


$opSubs = $myconn->query($query) or die(mysqli_error($myconn)); 
while($opSubsRs = $opSubs->fetch_assoc()){ 
    -- SMTP connection -- 
    if($mail->Send()){ 
     $myconn->query("INSERT INTO tasks SET 
       CID=1, 
       subscriber_mail='". $opSubsRs['subscriber_mail'] ."' 
     "); 
    } 

} 

因此,这个系统对我的本地主机和Namecheap,Godaddy没有重复记录工作正常,但一些托管服务在任务表中添加相同的记录。它可能是sql_modeNULL,BINARY的问题?使用MyISAM的数据库引擎。

问候。

回答

0

当你插入表格时,你应该检查电子邮件是否已经存在。

$query = "SELECT email from subscribers"; 

获取该查询,然后检查是否存在邮件后

if($query->fetch->rowcount < 1){ 
$query = "Insert into subscribers(email) values (email)" 

} 

你也不要手动插入ID只要打开自动递增。

+0

是的,但用户提取查询选择只有未发送的邮件加入为(T.subscriber_mail IS NULL)如果我检查此循环中的任务列表可能会降低系统性能?如果我尝试在每个循环中检查具有1m记录的任务表? –

+0

@GökhanAYVAZ你可以将你发送的文件保存到一个文件中,然后从中加载它。这种方式的性能不是问题,也取决于电子邮件的大小性能不应该是一个问题。 –