【发布时间】: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 语句会是什么样子?
-
您可以将变量传递给存储过程。