2013-03-23 42 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