MySQL - 有条件地插入多个值

时间:2014-05-28 10:59:54

标签: mysql

好的,所以我有一张桌子可以对游戏进行投注 该表包含列:user_id,event_id,bet。
用户可以在一个请求中将他/她(多个)投注发送到服务器。

  • 我需要使用一个查询插入多个投注,同时检查没有投注 是在已经开始/结束的事件上。
  • 如果至少有1个已开始/已完成的事件,我并不关心整个查询是否取消,或者只是忽略了“不合格”的投注。

问题
如何在一个查询中插入多个下注(行),同时在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)  

刚刚添加(连接)到查询结尾...

2 个答案:

答案 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 = 5WHERE _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)

你试过UNION吗?

 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) = ? );