我想知道是否可以在单个查询中进行此操作(我现在试图写一段时间而且没有任何想法)
我有两张桌子:
票
+----------+-----+-----------+
| 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调用来执行此操作,但我真的想知道是否可以只使用一个查询。
答案 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进行两次更新所需的信息。