如果在另一个表中满足条件,则更新一个表

时间:2015-08-19 21:20:59

标签: mysql

我想知道是否可以在单个查询中进行此操作(我现在试图写一段时间而且没有任何想法)

我有两张桌子:

+----------+-----+-----------+
| ticketid | win | processed |
+----------+-----+-----------+
|        1 |   0 |         0 |
|        2 |   0 |         0 |
|        3 |   0 |         0 |
+----------+-----+-----------+

playedmatches

+---------+----------+-----+-----------+
| matchid | ticketid | win | processed |
+---------+----------+-----+-----------+
|    1233 |        1 |   1 |         1 |
|    3144 |        1 |   0 |         1 |
|    1334 |        2 |   1 |         1 |
|    4441 |        2 |   1 |         1 |
|    1442 |        3 |   0 |         0 |
|    9723 |        3 |   1 |         1 |
+---------+----------+-----+-----------+

我需要的是在规则下更新 tickets.win ticket.processed ,以及 playmatches 中的所有行已处理的是playsmatches.ticketid 。如果我们说,每次匹配 ticketid = 2 已处理= 1 我需要将 tickets.processed 更新为1.此外,如果全部已处理匹配是 win = 1 ,然后 tickets.win = 1

在这种情况下,票证表应该像:

+----------+-----+-----------+
| ticketid | win | processed |
+----------+-----+-----------+
|        1 |   0 |         1 |
|        2 |   1 |         1 |
|        3 |   0 |         0 |
+----------+-----+-----------+

我有一些想法如何在php中使用2个MySQL调用来执行此操作,但我真的想知道是否可以只使用一个查询。

2 个答案:

答案 0 :(得分:2)

如果你真的想在一个查询中使用它,你可以测试这样的东西:

update tickets t join (
    select ticketid, if(sum(win) = count(*), 1, 0) as allwin
    from playedmatches
    group by ticketid
    having sum(processed) = count(*)
) j on j.ticketid = t.ticketid
set t.processed = 1,
    t.win = if(j.allwin, 1, t.win); 

答案 1 :(得分:0)

您可以查看playedmatches并使用

汇总ticketid
count(ticketid) as a, sum(win) as b, sum(processed) as c

a = b时处理所有故障单。当a = b = c时,所有处理过的匹配都是胜利。

这将为您提供通过PHP进行两次更新所需的信息。