好的,所以我有一张桌子可以对游戏进行投注
该表包含列:user_id,event_id,bet。
用户可以在一个请求中将他/她(多个)投注发送到服务器。
问题
如何在一个查询中插入多个下注(行),同时在select语句上调整插入(检查每个事件的状态)?
以下是我将使用的查询(如果它有效)(当然不是):
INSERT INTO bet_on_event (user_id, event_id, bet)
VALUES (1,5,1), (1,6,2)
IF (SELECT COUNT(*) FROM events WHERE _id IN(5,6) AND status=0) = ?;
解释
1.如上所述,这些值是预制的 - 用户要求
2.游戏/活动有地位。 0表示游戏尚未开始,因此可以下注
3. select语句只计算有多少请求事件的状态为0
4.“IF”应检查(3)中的计数是否等于用户要求下注的事件数量,从而确认所有事件都可以下注。
'IF'应该替换为有效的东西,如果你对我想要实现的目标有更好的了解,那么整个陈述可以被替换。
一个更简单的查询(对我的情况来说还不够,但适用于1行)是:
INSERT INTO bet_on_event (user_id, event_id, bet)
SELECT 1,5,1 FROM dual
WHERE (SELECT COUNT(*) FROM events WHERE _id IN(5,6) AND status=0) = ?;
有什么想法吗?这甚至可能吗?投注会被大量使用,所以我希望尽可能快地进行投注 - 只需1次查询 非常感谢你。
修改
这就是我最终做的,取自Thorsten的答案(我将其更改为动态构建的查询,因为这是我需要的):
var query='INSERT INTO bet_on_event (user_id, event_id, bet)';
for(var i=0; i<eventIds.length; i++){
query+= ' SELECT ' + userId + ',' + eventIds[i] + ',' + bets[i]
+ ' FROM dual WHERE EXISTS (SELECT * FROM events WHERE id = ' + eventIds[i]
+ ' AND Status = 0)';
if(i < eventIds.length - 1){
query += ' UNION ALL';
}
}
其中eventIds和bet是相应的顺序(如地图)
编辑2
我还想更新已经存在的赌注(如果用户想要......)。
因此需要使用阵列中的相关投注更新每一行。这是解决方案:
ON DUPLICATE KEY UPDATE bet=VALUES(bet)
刚刚添加(连接)到查询结尾...
答案 0 :(得分:2)
这对你有用吗?如果id 5已经启动,则它会插入1,5,1。对于1,6,1和id 6也是如此。
INSERT INTO bet_on_event (user_id, event_id, bet)
SELECT 1,5,1 FROM dual WHERE NOT EXISTS
(SELECT * FROM events WHERE _id = 5 AND Status <> 0)
UNION ALL
SELECT 1,6,1 FROM dual WHERE NOT EXISTS
(SELECT * FROM events WHERE _id = 6 AND Status <> 0);
编辑:如果您不希望在一个或多个游戏开始时插入任何内容,则只需将WHERE _id = 5
和WHERE _id = 6
替换为WHERE _id IN (5,6)
即可。或者只有一个存在子句:
INSERT INTO bet_on_event (user_id, event_id, bet)
SELECT *
FROM
(
SELECT 1,5,1 FROM dual
UNION ALL
SELECT 1,6,1 FROM dual
) tmp
WHERE NOT EXISTS (SELECT * FROM events WHERE _id IN (5,6) AND Status <> 0);
答案 1 :(得分:0)
INSERT INTO bet_on_event (user_id, event_id, bet)
(SELECT 1,5,1 FROM dual
WHERE (SELECT COUNT(*) FROM events WHERE _id IN(5,6) AND status=0) = ?
UNION
SELECT 1,6,2 FROM dual
WHERE (SELECT COUNT(*) FROM events WHERE _id IN(5,6) AND status=0) = ? );