2014-05-12 42 views
0

我有一个更新操作,我一次执行多个用户(值保持不变)。出于验证原因,是否可以将表连接到更新语句?sql更新语句与from子句进行验证?

举例来说,这里是我的时刻声明:

$user_set = array(1, 5, 10, 15, .....) 

//update 'changed' status for ALL selected users at once 
$stmt = $db->prepare(" 
    UPDATE users 
    SET changed = ? 
    WHERE user_id IN(". implode(', ', array_fill(1,count($user_set),'?')) .") 
"); 

array_unshift($user_set, 1);  
$stmt->execute($user_set); 

在一个完美的情况下,我想一个表(计算机)连接到用户表验证帐户所有权,如果此更新“有效'并且应该发生与否。

我在之前发现我可以做的是使用DELETE,但是可以使用UPDATE来完成吗?例如删除使用验证我想:

$selected = array(1, 5, 10, 15, .....) 

$stmt = $db->prepare(" 
    DELETE del_table.* 
    FROM some_table as del_table 
    LEFT JOIN 
     users 
     on users.user_id = del_table.user_id 
    LEFT JOIN 
     computers 
     on computers.computer_id = users.computer_id    
    WHERE computers.account_id = ? AND del_table.activity_id IN(". implode(', ', array_fill(1,count($selected),'?')) .")  
"); 

// use selected array and prepend other data into the array so binding and execute work in order 
array_unshift($selected, $_SESSION['user']['account_id']); 
$stmt->execute($selected); 

EDIT(液):

感谢亚历克斯...它的作品!

$selected = array(5,10,12,13); 

$stmt = $db->prepare(" 
    UPDATE users 
    INNER JOIN computers 
     on computers.computer_id = users.computer_id  
    SET changed = ? 
    WHERE computers.account_id = ? AND users.user_id IN(". implode(', ', array_fill(1,count($selected),'?')) .")  
"); 

array_unshift($selected, 1, $_SESSION['user']['account_id']); 
$stmt->execute($selected); 

回答

2

是的,你可以,as documented here下的多表语法部分。

UPDATE [LOW_PRIORITY] [IGNORE] table_references 
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
    [WHERE where_condition] 

你只需要确保你正确地命令语句。

UPDATE my_table 
    INNER JOIN other_table 
    ON my_table.col2 = othertable.col2 
SET my_table.col = 'foo' 
WHERE other_table.col = 'bar' 
+0

完美的作品!有没有像这样的INSERT INTO可用?在遇到删除功能后,我实际上查找了有关这方面的信息。我最终做了一个初步的查询,以获得一个有效的user_set,然后使用array_intersect与它和我的'未经验证的'设置给我有效的插入结果...但如果我可以做同样的方法,像这里... – user756659

+0

它将取决于您的要求,但“INSERT INTO ... SELECT”语法可能适合您,您可以在这里阅读更多关于它的信息http://dev.mysql.com/doc/refman/5.6/en/insert-select.html –

0

试试这个

$stmt = $db->prepare(" 
UPDATE users 
SET changed = ? 
from users 
JOIN computers on computers.computer_id = users.computer_id 
WHERE user_id IN(". implode(', ', array_fill(1,count($user_set),'?')) .") 
"); 
+0

这不起作用,您构建语句的顺序和您使用的语句不正确,并导致解析错误。看到我的答案更详细。 –