繁体   English   中英

插入,除非存在于其他表中

[英]INSERT unless exist in other table

我在wesite上有users表,并且我想编写一个函数,该函数将带email列并将其插入到不同的表mailing_list ,但mailing_list是那里不存在该电子邮件。

对于这个问题,您可以假设每个表都有以下列: IDusernameemail

这是我当前的代码:

$get_mails = $db->query("SELECT `username`,`email`,`email_approved`,`ver` FROM `users` WHERE ver='yes' && email_approved='1'");
while ($mails = $get_mails->fetch_assoc())  {
    if ($db->query("SELECT `email` FROM `mailing_list` WHERE email='".$mails['email']."'")->num_rows == 0)  {
        $db->query("INSERT INTO `mailing_list` VALUES('','".$mails['email']."','".$mails['username']."')");         
    }
}

如您所见,它不是非常有效。 有没有办法在INSERT查询本身中做到这一点?

谢谢。

一种(有点脏)的解决方案是在mailing listemail字段中放置一个唯一索引,这样可以防止重复输入,因此您不必首先执行选择查询。

编辑,例如:

$db->query
(
    "INSERT IGNORE INTO `mailing_list` 
    SELECT '',email,username FROM `users`
    WHERE ver = 'yes' AND email_approved = '1'"
);

我建议使用INSERT ... SELECT方法,该方法将允许您使用联接进行过滤以及通过单个查询而不是迭代查询来执行所有插入。

可能看起来像这样:

INSERT INTO mailing_list (email, username)
SELECT u.email, u.username
FROM users AS u
LEFT JOIN mailing_list AS ml
  ON u.email = ml.email
WHERE
  /* this filters to only those records that don't exist in mailing_list */
  ml.email IS NULL
  /* these are conditions from your initial query as shown */
  AND u.ver = 'yes'
  AND u.email_approved = '1'

为了优化查询,您需要在u.emailu.veru.email_approvedml.emailu.email索引。 这还假设您在ml.id上具有一个自动增量索引,这样在进行插入操作而未为此字段指定值时,它会按顺序获取下一个数字。

未来编码的技巧-当您发现自己想在循环内进行查询时,应该仔细查看代码,因为通常会有更好的方法来简化数据访问。

Try this query: First query will stay as it is and this query is for next 2 queries
INSERT INTO `mailing_list` (email) select ".$mails['email']." from mailing_list where (select count(.$mails['email'].) from test1 where  name1 = '.$mails['email'].') = 0 limit 1;

查询样例:

Insert into mailing_list (email) select "z.y@z.com" from mailing_list where (select count(email) from mailing_list where email='z.y@z.com' and ) = 0 limit 1;

这将给出电子邮件字符串作为输出

select "z.y@z.com" from mailing_list where 

这将验证表中电子邮件的位置(如果计数为0,则将插入新电子邮件,如果mot则不会插入)

select count(email) from mailing_list where email='z.y@z.com') = 0

这是为了限制不匹配的电子邮件

limit 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM