关于模拟大赛的一些sql
起初,我没有在C#程序中完成本地数据的更新。
那么网站所需的数据是通过视图完成的,显然这样降低了网站的效率。
视图创建语句如下:
create view newmnds.v_account as SELECT N.user_account as account,N.user_name AS name,N.user_mt4Account as mt4Account,M.BALANCE AS bal,N.user_initialBal AS initBal FROM mt4.mt4_users AS M RIGHT JOIN newmnds.account AS N ON M.LOGIN = N.user_mt4Account;
通过这个视图,就能查询到本地用户在mt4库中的信息(通过sql:select * from newmnds.v_account)。事实上,应该将网站需要的信息保存到本地表,这样每次刷新网页就能避免
一次两表联查。实现方法就是在C#程序中对本地表中的数据进行更新
更新account表中的user_balance的sql如下:
update newmnds.account inner join mt4.mt4_users on account.user_mt4Account = mt4_users.LOGIN SET account.user_balance = mt4_users.BALANCE ,account.user_updateTime = unix_timestamp();
因为模拟大赛的排名是按照账号余额和交易手数来进行的,因此需要统计每个用户的交易手数。
更新account表中的user_orderTotal的sql如下:
update newmnds.account inner join newmnds.trades on account.user_mt4Account = trades.login set account.user_orderTotal = (select count(*) from newmnds.trades where login = account.user_mt4Account);
网站页面也需要每个用户的交易信息,因此起初也是创建了一个关于交易信息的视图。
CREATE VIEW newmnds.v_orders AS select N.user_mt4Account AS account,M.TICKET AS id ,M.VOLUME AS volume ,M.OPEN_TIME AS openTime,M.OPEN_PRICE AS openPrice,M.CLOSE_TIME AS closeTime,M.CLOSE_PRICE AS closePrice,M.COMMISSION AS commission ,M.PROFIT AS profit,M.SYMBOL AS symbol,M.SL,M.TP,M.SWAPS from mt4.mt4_trades AS M right join newmnds.account AS N on M.LOGIN = N.user_mt4Account;
然后根据视图就能每个用户的交易信息查出,但是这样依然存在效率问题,而且更大的问题是交易信息是根据mt4表查出来的,交易记录是最近一段时间的,因此是不全的。
解决办法就是,在本地再创建一个trades表,专门保存每个用户的交易信息。
然后在利用C#程序实时更新这个trandes表。
replace into newmnds.trades (ticket,login,symbol,volume,open_time,open_price,SL,TP,close_time,close_price,profit,SWAPS,commission,updatetime) select TICKET ,LOGIN ,SYMBOL,VOLUME,OPEN_TIME,OPEN_PRICE,SL,TP,CLOSE_TIME,CLOSE_PRICE,PROFIT,SWAPS,COMMISSION,unix_timestamp() from mt4.mt4_trades;
通过replace into 完成 trades表的更新。
注:mysql 和 mssql 在关联表更新数据的sql有些差异:
mssql的sql类似这样:
update newmnds.account set N.user_balance = M.BALANCE from newmnds.account AS N left join mt4.mt4_users AS M on N.user_mt4Account = M.LOGIN;

浙公网安备 33010602011771号