我有下一个表结构:游戏 - 包含基本游戏信息(体育赛事),投注 - 投注变化(团队胜利,团队b胜等),投票 - 用户选择投注变化.
下一个查询显示所有未开始游戏的所有最后投注变化的列表.如果当前用户对其进行了投票,则列表中的某些投注也会包含一些信息.
用于下次检测插入选择:1 - 是用户已经投给了这个赌?2 - 获取用户的choise(是\否),3 - 获取用户的投票量.
SELECT bets.*, games.Time, games.TA, games.TB,
(SELECT COUNT(*) FROM votes WHERE BID=bets.BID AND UID=$UserID) AS Vt,
(SELECT YN FROM votes WHERE BID=bets.BID AND UID=$UserID) AS yn,
(SELECT Pt FROM votes WHERE BID=bets.BID AND UID=$UserID) AS Pt
FROM bets
LEFT JOIN games ON games.GID = bets.GID
WHERE games.Yes=0 AND bets.Dl=0
ORDER BY bets.Time DESC
Run Code Online (Sandbox Code Playgroud)
我该如何优化它?如何在一个查询中获得votes.YN和votes.Pt?
你left join没用,因为你在第二个表中使用了一个值.所以,inner join为了清楚起见,我会将其改为.
另外,子查询for YN和PT没有聚合,所以它们似乎可以返回多行.我假设应该有一个sum().
然后,我将三个相关的子查询移动到from子句中.这需要汇总bid:
SELECT bets.*, games.Time, games.TA, games.TB,
coalesce(v.vt, 0) as vt, coalesce(v.yn, 0) as yn, coalesce(v.pt, 0) as pt
FROM bets inner join
games
ON games.GID = bets.GID left join
(select bid, count(*) as vt, sum(yn) as yn, sum(pt) as pt
from votes v
where UID=$UserID
group by bid
) v
on v.bid = bets.bid
WHERE games.Yes=0 AND bets.Dl=0
ORDER BY bets.Time DESC;
Run Code Online (Sandbox Code Playgroud)
编辑:
我要指出,这可能会也可能不会提供改进的性能(取决于where条款的选择性等因素).随着left outer join用于跟踪所有从行bets,它可能会更好.
添加以下索引应该修复查询的原始版本: votes(bid, uid).
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |