【问题标题】:Combine a SELECT and Two UPDATES?结合一个选择和两个更新?
【发布时间】:2013-04-26 21:54:30
【问题描述】:
$query = "SELECT loved FROM users WHERE uid=:quitter";
$query = "UPDATE users SET status='0', loved=NULL, beloved_count='0' WHERE uid=:deceased";
$query = "UPDATE users SET beloved_count=beloved_count-1 WHERE uid=:lover";

因为从我的代码中可能不清楚,这就是发生的事情:
用户 123 退出。 我需要
1) 找出谁 123 “爱”
2)更新123的行(设置状态='0'等)
3) 更新“loved”用户行,将“beloved_count”减1

这一切都发生在一张桌子上。一个查询会发生这种情况吗?理想情况下,我想用一个查询来完成,但即使是两个也比我现在用 3 个单独的查询更好。

我看过JOINs,但我不清楚,因为我以前从未使用过它们。我见过查询组合的例子,但没有任何反映这一点。我正在使用 PHP 5.4 和 PDO。


类似:

$query = "UPDATE users SET status='0', loved=NULL, beloved_count='0' WHERE uid=:deceased;  
    UPDATE users SET beloved_count=beloved_count-1 WHERE uid=:lover;";

【问题讨论】:

  • 这两次更新是根据不同的条件改变不同的数据。你最好做两个查询,而不是试图想出一个巨大的纠结的怪物。
  • 我的印象是,对于某些数据库和扩展,有可能从更新中返回一个值。这可能在这里不适用,是吧?
  • 同意 Marc B - 作为一项学术练习,它可能合并更新,甚至将更新作为选择的副作用进行 - 但它不是在实践中这样做是个好主意。 (不,它不可能在 SQL 中为 UPDATE 返回数据)。
  • 没有。更新不返回任何数据,除了一些元数据,例如mysql 的“受影响的行”。您可以在更新中使用选择子查询,例如UPDATE sometable SET somefield=(SELECT ... FROM othertable),但这不是你想要的。您仍然可以有效地运行 3 次以上的查询,并进行难以维护的丑陋查询。保持简单,只需执行三个查询。它们很简单,开销也很小。
  • 是的,有可能,但就像我说的,UGLYupdate users SET beloved_count=CASE WHEN uid:=lover THEN beloved_count-1 ELSE beloved_count END, status=CASE WHEN uid:=deceased THEN 0 ELSE status END, blah blah blah.。你只会在脚上开枪。

标签: php mysql join pdo


【解决方案1】:

也许是这样的?从本质上讲,您将退出用户加入到他喜欢的所有用户中。

UPDATE 
    users AS u1, 
    users AS u2 
SET 
    u1.status='0',
    u1.loved=NULL,
    u1.beloved_count='0',
    u2.beloved_count=u2.beloved_count-1
WHERE 
    u1.uid=:quitter
    AND u1.loved=u2.uid;

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    相关资源
    最近更新 更多