2013-03-23 96 views
0

我对SQL的了解有限,请事先道歉,如果它很明显。我有一个select查询,返回一个'未读'消息的结果集,并与我正在处理的简单Web应用程序的用户表(称为作者)的表中的发件人ID匹配。使用左连接从选择查询进行更新

作者:

aId int(20) NO PRI NULL auto_increment 
aUser varchar(30) NO UNI NULL  
aPass varchar(40) NO  NULL  
aEmail varchar(30) NO UNI NULL  
aBio mediumtext YES  NULL  
aReg datetime NO  NULL  

消息:

msgId int(20) NO PRI NULL auto_increment 
mSender int(20) NO MUL NULL  
mReciever int(20) NO MUL NULL  
mTitle tinytext NO  NULL  
mBody mediumtext NO  NULL  
mRead tinyint(4) NO  NULL  
mDate datetime NO  NULL  

的选择查询我使用的是(韩国社交协会玛蒂娜):

SELECT messages.mTitle, messages.mBody, messages.mDate, authors.aUser 
FROM messages LEFT JOIN authors on aId=mSender WHERE mReciever = '$aId' AND mRead = '0' 

$帮助表说明如下是一个php会话变量,它包含活动用户的用户标识。我的PHP应用程序将假设,因为这'未读'消息已被处理它现在阅读,任何人都可以协助修改上述查询也更新mRead为1,表明它是从现有的职位阅读,在这里我读你可以在同一个SQL语句中用UPDATE进行选择,会不会有另一种解决方法,我离正确的解决方案有多远? 非常感谢提前。

+1

你为什么不只是运行'UPDATE'在SELECT之后查询? – 2013-03-23 16:36:46

回答

1

你听到的是正确的。您不能在一个语句中选择和更新。您的PHP代码必须执行两个不同的SQL命令。选择后,使用PHP和你的结果找出你要返回的消息的ID,然后在消息表上执行UPDATE语句,比如“UPDATE messages SET mRead = 1 WHERE msgId IN(?)”。

+0

谢谢你澄清家伙。我在脚本的最后添加了一个更新查询来进行所需的更新。欢呼 – user2172307 2013-03-23 16:51:09

0

您可以在UPDATEJOIN表:

UPDATE table1 
LEFT JOIN table2 ON(table1.id = table2.id) 
SET ... 
WHERE ... 

WHERE语句选择的记录。

相关:https://stackoverflow.com/a/806925/1815881

我的博客文章:http://athlan.pl/mysql-update-join/

第二种方式是选择的ID的记录更新和执行:

UPDATE table 
SET ... 
WHERE id IN(...your select...) 
+0

HI Athlan。脚本在将它们标记为已读之前首先显示消息,因此select必须在更新之前出现。感谢您的链接。 – user2172307 2013-03-23 16:53:40

+0

是的,所以你可以在UPDATE查询中加入这些记录,或者通过收集他们的ID或者再次执行select语句来将它们设置为IN()语句。 – Athlan 2013-03-23 17:00:49