【问题标题】:PHP/MySQL is there SELECT...INSERT and/or SELECT...INSERT...DELETEPHP/MySQL 是否存在 SELECT...INSERT 和/或 SELECT...INSERT...DELETE
【发布时间】:2015-01-20 20:38:47
【问题描述】:

我是 MySQL 新手,我正在尝试执行以下操作,并希望我可以通过对 MySQL 调用的单个 PHP 查询来完成所有操作,而不必调用、存储在 php、调用、存储在 php 等.

这是我的数据库设置。 1. 用户表,包括电子邮件地址。 2. 按电子邮件地址和邀请受邀者的用户的“受邀者”表 3.“朋友”表

我想将用户表与受邀者表连接起来,以确定哪些受邀者已注册为用户以及谁邀请了他们(请记住,他们可能已被超过 1 人邀请)。从那里,我会将新注册的受邀者与邀请他的人一起插入到朋友表中。最后,我将从受邀表中删除该受邀者,这样他就不会继续收到邀请了。

我看到了如何通过 3 个单独的 php 调用 mysql 来做到这一点:1. 一个 JOIN 来查找用户表和被邀请者表中的用户(加入也将识别谁邀请了他们) 2. 一个 INSERT将这对放入好友表 3. 一个 DELETE 将用户从被邀请者列表中删除。

但这将是更高的流量/更少的优化,多次调用 MySQL 服务器以及我的 php 脚本存储的大量数据,我真的只需要下一次 MySQL 调用。我有一种感觉,这应该可以在 1 次调用中实现,并且没有数据返回到 php 脚本。

我看到有一个 INSERT...SELECT MySQL 调用 (http://dev.mysql.com/doc/refman/5.0/en/insert-select.html),但我无法找到一种方法来组合上面的步骤 1 和 2,这将是一个 SELECT...INSERT 选项。这存在吗?我尝试了以下方法,但没有奏效……这样的事情将是我的理想。

SELECT users.user as user1, invited2.user as user2, invited2.email as email2 FROM users RIGHT JOIN invited2 ON users.email=invited2.invitee; 
INSERT INTO friends (user, friend) VALUES (user1, user2), (user2, user1);  
DELETE FROM invited2 WHERE invited2.email = email2; 

INSERT INTO 之前的部分独立工作,但就像我说的,如果我只是将它返回到我的 php 脚本,我只需要存储所有结果,然后自己调用第二个结果。有没有办法在一个电话中做到这一点?如果是这样,有没有办法在之后添加删除语句(从受邀者 2 WHERE 受邀者 = 用户电子邮件中删除)?

任何建议将不胜感激。提前致谢。

【问题讨论】:

  • 您可以使用INSERT....SELECT 加上DELETE 语句创建一个存储过程。
  • @JayBlanchard 感谢您的建议。我认为这是一个后备计划,但我听到了对存储过程的不同评价,特别是在可移植性和保持数据库服务器之外的流量方面,所以我希望避免这种情况。
  • 您应该使用数据库服务器来处理涉及数据的繁重工作,并尽可能多地保留 PHP 之外的数据操作代码。存储过程是非常可移植的,谁给你差评就是找错人了。
  • @JayBlanchard 对于如何在存储过程的调用之间存储数据,我也有点困惑。例如,一旦我进行了连接选择,我是否需要将其设置为等于一个变量?例如,语法是这样的吗? a = 选择 users.user 作为 user1,invited2.user 作为 user2,invited2.email 作为 email2 FROM users RIGHT JOIN known2 ON users.email=invited2.invitee;那么 INSERT 语句会是什么样子?
  • 您可以将变量传递给存储过程。

标签: php mysql


【解决方案1】:

MySQL 确实提供了 INSERT...SELECT (http://dev.mysql.com/doc/refman/5.1/en/insert-select.html)

您的 SQL 可以编辑为:

INSERT INTO friends (user, friend)
SELECT users.user as user1, invited2.user as user2
FROM users
RIGHT JOIN invited2 ON users.email=invited2.invitee;

DELETE invited2
FROM users
RIGHT JOIN invited2 ON users.email=invited2.invitee;

在这种情况下,INNER JOIN 似乎比 RIGHT JOIN 更有意义。

【讨论】:

  • 您能否也解决问题的DELETE 要求?
  • @Mr.Llama 感谢您的浏览。我的 delete 语句将删除受邀者的电子邮件地址与用户表中用户的电子邮件地址匹配的行。
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2014-07-08
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2011-03-18
相关资源
最近更新 更多