当从另一个表中选择没有要加入

时间:2016-06-24 18:01:02

标签: php mysql database

我们有一个messages表来保存邮件,我们有一个message_statuses表,用于保存用户与每个message的个人互动

messages表中有一条消息,用户应在应用中看到该消息。当他们从我们的API发送GET条消息时,我们想在messages_status表中创建一个新行,该行将跟踪该表上的用户ID和读/看状态,以便我们确定何时向他们显示消息和天气或不要将其标记为看不见并显示通知泡沫。

当我们选择用户应该收到的消息时,我知道我可以加入message_id这样

SELECT * FROM messages AS a JOIN message_statuses AS b ON a.id = b.message_id;

但是,如果有新消息添加到messages,我们尚未向message_statuses表添加新行,以开始跟踪该用户与message的互动情况,我们想添加一个新行,以便我们可以跟踪打开/读取状态以及删除状态。

是否有可能使用子查询不仅选择该连接,还在message_statuses表中没有行时插入新行?

我在这里看到这个页面http://dev.mysql.com/doc/refman/5.7/en/insert-select.html但是我在理解这是否适合我们时遇到了一些麻烦。

我们正在使用PHP,因此我知道我可以使用一些单独的查询解决它,但我真的想知道我们是否可以在一个查询中使用它。我知道我已经看到插入重复键似乎它可以工作但我不是非常熟悉它。

[UPDATE]

我在sql运行之前尝试添加此触发器

$trigger = "CREATE TRIGGER insert_status_row AFTER SELECT ON text2bid_messages
 FOR EACH ROW
 BEGIN
   IF selected.opened IS NULL THEN
     INSERT INTO text2bid_message_statuses (user_id, message_id) = ($user_id,selected.id);
   END IF;
 END";
mysql_query($trigger);

但到目前为止,这似乎没有做我们需要的,也许我添加了错误的触发器?有点似乎我不能在select上触发?

1 个答案:

答案 0 :(得分:1)

首先,您可以使用left join获取所有消息:

SELECT *
FROM messages m LEFT JOIN
     message_statuses ms
     ON m.id = ms.message_id;

message_status中的列将为NULL

如果您想在每次创建新邮件时将记录插入message_status,您可以使用插入触发器执行此操作。