Mysql SQL:如果*条件*在另一行上,则更新一行

Mysql SQL:如果*条件*在另一行上,则更新一行,mysql,sql,mariadb,case,where-clause,Mysql,Sql,Mariadb,Case,Where Clause,我的SQL有问题 当且仅当另一行上的值与条件匹配时,我想更新给定行上的值;然后更新第二行上的另一个值 好的,如果我这样解释的话,就不清楚了,下面是我将使用mysqli绑定参数的代码: --mariaDB: UPDATE `accountlist` JOIN `data` ON `accountlist`.`id`=`data`.`id` SET `upvotes`= `upvotes` + (`user`= ?), `allow` = (CASE WHEN `accou

我的SQL有问题

当且仅当另一行上的值与条件匹配时,我想更新给定行上的值;然后更新第二行上的另一个值

好的,如果我这样解释的话,就不清楚了,下面是我将使用mysqli绑定参数的代码:

--mariaDB:

UPDATE `accountlist` JOIN `data` ON `accountlist`.`id`=`data`.`id`
    SET `upvotes`= `upvotes` + (`user`= ?),
        `allow` = (CASE WHEN `accountlist`.`id` = ?
                   THEN ?
                   ELSE `allow`
                   END)
WHERE (SELECT `allow` FROM `data` WHERE `id` = ?) < ?;

--mysql:

UPDATE `accountlist` JOIN `data` ON `accountlist`.`id`=`data`.`id`
    SET `upvotes`= `upvotes` + (`user`= ?),
        `allow` = (CASE WHEN `accountlist`.`id` = ?
                   THEN ?
                   ELSE `allow`
                   END)
WHERE `data`.`id` = ? AND `allow` < ?;

--params sample: "admin", 2, "2020-04-20", 2, "2020-04-20"
--               (same value here means always same value)
参数:管理员,22020-04-20,22020-04-20 B行上的允许值不低于2020-04-20:

什么也没发生。 参数:管理员,22020-04-22,22020-04-22 B行上的允许值低于2020-04-20:

增加2->3中A行的追加投票 B行上的允许更新为2020-04-20->2020-04-22 参数:bar,12020-04-19,12020-04-19 A行上的允许值低于2020-04-19:

第C行的向上投票增加1->2 A行上的允许更新为2020-04-18->2020-04-19 更新2:

我想做的是: 如果用户1想要投票给用户2,每个人每天最多可以投票给其他人一次,当它单击按钮时,他的行上的允许值将与第二天进行比较:

如果allowed等于第二天,则表示用户1已经向上投票,他可能是用户2、用户3或其他人,因此不会发生任何更改 如果allowed低于第二天,则表示允许用户1向上投票给某人,因此用户2行的upvote将递增,用户1行的allowed将更新到第二天
不要担心如果用户1或用户2实际上不存在会发生什么,或者如果用户1试图提升自己会发生什么?*因为我在PHP代码中对此进行了检查。

让我们来了解一下。首先,让我们对每个列进行限定,以帮助查看哪个列在哪个表中:

UPDATE a JOIN d ON a.`id` = d.`id`
    SET d.`upvotes`= d.`upvotes` + (a.`user`= ?),
        d.`allow` = (CASE WHEN a.`id` = ?
                   THEN ?
                   ELSE d.`allow`
                   END)
WHERE d.`id` = ? AND d.`allow` < ?;
现在很明显,这个案子是白费力气。因此,查询简化为

UPDATE ad
    SET `upvotes`= `upvotes` + (`user`= ?),
        `allow` = ?
WHERE `id` = ? AND `allow` < ?;
现在让我们回到两张桌子:

UPDATE a JOIN d ON a.`id` = d.`id`
    SET d.upvotes = d.upvotes + (a.user = ?),
        d.allow = ?
    WHERE d.id = ? AND d.allow < ?;
这导致了另一种形式。我不知道这是否更好

UPDATE d
    SET d.upvotes = d.upvotes +
                    ( ( SELECT  user = ? FROM a WHERE a.id = d.id ) )
        d.allow = ?
    WHERE d.id = ? AND d.allow < ?;
或者,也可能没有任何显著差异:

UPDATE d
    SET d.upvotes = d.upvotes +
                EXISTS ( SELECT  user = ? FROM a WHERE a.id = d.id )
        d.allow = ?
    WHERE d.id = ? AND d.allow < ?;

我试图为你的问题找到一个解决办法,我可能有一个答案 我是否正确理解这里的工作流程: 每个用户每天可以向上投票1次

用户1向上投票用户2 user1今天已经投票了吗? ->是的,什么也不做 ->否:将user1和+1的日期更改为user2的更新日期 在那个例子中:管理员,22020-04-20,22020-04-20

2=>user1 admin=>user2 2020-04-20=>投票日期 我说得对吗? 如果是,这里是我的解决方案

马里亚布

UPDATE data SET upvotes = CASE WHEN id = (SELECT id FROM accountlist WHERE accountlist.user = ?)
                AND 
               (SELECT allow FROM data inner join accountlist on accountlist.id = data.id 
                 where accountlist.id = ? )< ?
            THEN upvotes + 1
            ELSE upvotes
          END,
allow = CASE WHEN id = ?
THEN ?
ELSE allow
END
有价值的: 管理员,22020-04-20,22020-04-20=>无修改

管理员,2,2020-04-22,2,2020-04-22

         accountlist                       data
   |------------|---------------|    |------------|--------------|----------|
   | id         | user          |    | id         | allow        | upvotes  |
   |------------|---------------|    |------------|--------------|----------|
A: | 1          | admin         |    | 1          | 2020-04-18   | 3        |
B: | 2          | foo           |    | 2          | 2020-04-22   | 0        |
C: | 3          | bar           |    | 3          | 2020-04-22   | 1        |
   |------------|---------------|    |------------|--------------|----------|
酒吧,112020-04-19,112020-04-19=>

             accountlist                       data
   |------------|---------------|    |------------|--------------|----------|
   | id         | user          |    | id         | allow        | upvotes  |
   |------------|---------------|    |------------|--------------|----------|
A: | 1          | admin         |    | 1          | 2020-04-19   | 3        |
B: | 2          | foo           |    | 2          | 2020-04-22   | 0        |
C: | 3          | bar           |    | 3          | 2020-04-22   | 2        |
   |------------|---------------|    |------------|--------------|----------|

通常情况下,运行测试是正确的,但使用2语句而不是1语句会更简单。

这可能是可行的,但您的问题目前还不清楚。请提供示例数据和预期结果,以表格文本的形式说明您实际需要的内容。通常,5到10行就足够了。第1行是如何定义的?基于身份?根据下一步的顺序,如果是的话,什么顺序?为什么不能对两个数据库都使用第二个版本?@GMB我的更新问题就足够了?为什么不做一些事情,比如检查是否允许用户投票、增加投票、更新日期?。无论如何,您的mariadb代码应该可以工作。不快速、不美观或不适用于所有边缘情况,例如,它不检查行1是否存在,但不应存在您描述的问题-除非数据中没有与行1或2匹配的条目。请检查并澄清数据是否相关,您永远不会提及。在mysql中使用这个mariadb查询很简单,我这样做是因为我在mysql中遇到了一个错误,它比我读到的更好地解释了您的原因,但是您应该首先澄清您的需求。它不起作用:它正确地更新了我所称的第2行,其中id=?但在所有版本中,用户在每种情况下都保持不变。查看我和@Solarflare之间的评论以了解更多信息:我们已经解决了,但他们都有一些问题,从MariaDB和MySQL之间的兼容性到类似于您的版本,在某些情况下不起作用。我也找到了一些可行的方法,看看链接,但这似乎是一个解决办法,而不是solution@Foxel-第一次“更新”未显示用户需要更改;请相应地编辑它。它在MariaDB上工作,但在MySQL上不工作。奇怪的是,我在一个服务器上试用了它,它似乎对MySQL也能起作用,虽然有点修改,但效果与MySQL相同。有什么建议吗?我安装了wamp服务器并在您的小提琴上测试它,当您将sql版本从8.0更改为5.7时,请求失败。您的服务器使用的是哪个版本?MySQL 5.6和phpMyAdmin,请参阅
UPDATE data
SET upvotes = CASE WHEN id = (SELECT id FROM (select * from accountlist) as al WHERE al.user = "bar")
                    AND 
                   (SELECT allow FROM (select * from data) as d inner join (select * from accountlist) as al1 on al1.id = d.id where al1.id = 1)<"2020-04-19"
                THEN upvotes + 1
                ELSE upvotes
              END,
allow = CASE WHEN id = 1
THEN "2020-04-19"
ELSE allow
END;
         accountlist                       data
   |------------|---------------|    |------------|--------------|----------|
   | id         | user          |    | id         | allow        | upvotes  |
   |------------|---------------|    |------------|--------------|----------|
A: | 1          | admin         |    | 1          | 2020-04-18   | 2        |
B: | 2          | foo           |    | 2          | 2020-04-20   | 0        |
C: | 3          | bar           |    | 3          | 2020-04-22   | 1        |
   |------------|---------------|    |------------|--------------|----------|
         accountlist                       data
   |------------|---------------|    |------------|--------------|----------|
   | id         | user          |    | id         | allow        | upvotes  |
   |------------|---------------|    |------------|--------------|----------|
A: | 1          | admin         |    | 1          | 2020-04-18   | 3        |
B: | 2          | foo           |    | 2          | 2020-04-22   | 0        |
C: | 3          | bar           |    | 3          | 2020-04-22   | 1        |
   |------------|---------------|    |------------|--------------|----------|
             accountlist                       data
   |------------|---------------|    |------------|--------------|----------|
   | id         | user          |    | id         | allow        | upvotes  |
   |------------|---------------|    |------------|--------------|----------|
A: | 1          | admin         |    | 1          | 2020-04-19   | 3        |
B: | 2          | foo           |    | 2          | 2020-04-22   | 0        |
C: | 3          | bar           |    | 3          | 2020-04-22   | 2        |
   |------------|---------------|    |------------|--------------|----------|