2013-02-22 108 views
0

我有兩個MySQL工作正常,我試圖找到一種方法將它們組合成一個單一的查詢。結合更新和選擇查詢

首先,它選擇一個僱員的ID。

SELECT 'ID' FROM `employee` ORDER BY ID DESC LIMIT 1; 

比方說,它返回ID爲100;

然後更新其ID爲100

UPDATE 'LOG' SET `TIME_EXIT`='2013/02/22' WHERE `ID`='100'; 

我能做到這一切在一個單一的查詢員工的數據?

+0

可以,但永遠只能返回相同的員工,除非你是ID的所有時間 – 2013-02-22 02:01:06

回答

3

只需加在一起:

UPDATE LOG SET TIME_EXIT = '2013/02/22' 
WHERE ID = (
       SELECT ID 
       FROM employee 
       ORDER BY ID DESC 
       LIMIT 
      ); 

但基於該代碼目前它只會不斷更新上次employee,您將需要使用一些其他標識符選擇正確的employee,以確保您有正確的一個。

UPDATE LOG SET TIME_EXIT = '2013/02/22' 
WHERE ID = (
       SELECT ID 
       FROM employee 
       WHERE NAME = 'JOHN SMITH' 
       ORDER BY ID DESC 
       LIMIT 1 
      ); 
+0

重新排序,我得到這個錯誤信息「您無法在FROM子句中指定目標表'log'進行更新」 – 2013-02-22 15:31:31

+0

此錯誤表明您有'UPDATE LOG ... SELECT ID FROM LOG',您是否正在嘗試更新日誌,同時選擇它?如果你是,你將需要另一種解決方案。 – sjdaws 2013-02-22 22:43:36

0

它現在是一個幾個月大,但也許可以幫助你或其他人通過谷歌找到這個......

如果你想更新相同選擇的表使用此字段:

UPDATE LOG SET 
    TIME_EXIT = '2013/02/22' 
WHERE ID = (
     SELECT ID 
     FROM (
      SELECT ID 
      FROM LOG 
      WHERE whatEverYouWantToCheck = whateverYouNeed 
     ) AS innerResult 
    ) 

所以,你從一個子選擇中選擇id。如果您嘗試直接對它進行選擇,mySQL會詢問您的錯誤消息You can't specify target table 'log' for update in FROM clause,但通過這種方式,您可以將子查詢隱藏在子查詢中,而且看起來沒問題。不要忘記AS innerResult以避免收到錯誤消息#1248 - Every derived table must have its own alias。另外,subsubquery字段名稱相匹配的子查詢字段名的情況下,你做這樣的事情SELECT COUNT(*)SELECT CONCAT('#', ID)