我现在正在编写一些 MySQL 命令,它们可以让我生成更好的统计数据。我现在的问题是,在特殊情况下应该调用一些查询,而在其他情况下则不需要。
我目前的尝试:(我把它短路了)
SET @var1=0, @var2=0;
SELECT @var1 := `id` FROM `sg_playerstats` ORDER BY `id` ASC LIMIT 0, 1;
SELECT @var2 := `Last Updated` FROM `sg_playerranking` LIMIT 0, 1;
IF @var1 > @var2 THEN (
TRUNCATE `sg_playerranking`;
SET
@Rank := 0;
INSERT INTO
`sg_playerranking`
SELECT
@Rank := @Rank + 1 AS `Rank`,
t.*,
@var1 AS `Last Updated`
FROM
(
SELECT
`player` AS `Player`,
FROM
`sg_playerstats`
GROUP BY
`player`
ORDER BY
`Score` DESC, ...
) t; )
END IF
SELECT `Rank`, ... FROM `sg_playerranking` WHERE 1
If 语句不起作用(语法错误。每个查询部分本身都在工作!)我做了一些研究,但除此之外什么也找不到!
括号没有区别!
编辑:
现在我真的很困惑!
我的代码是:
CREATE PROCEDURE generate_statistics (OUT param1 INT)
BEGIN
SET @var1=0, @var2=0;
SELECT @var1 := `id` FROM `sg_playerstats` ORDER BY `id` ASC LIMIT 0, 1;
SELECT @var2 := `Last Updated` FROM `sg_playerranking` LIMIT 0, 1;
IF @var1 > @var2 THEN
TRUNCATE `sg_playerranking`;
SET
@Rank := 0;
INSERT INTO
`sg_playerranking`
SELECT
@Rank := @Rank + 1 AS `Rank`,
t.*,
@var1 AS `Last Updated`
FROM
(
SELECT
`player` AS `Player`,
SUM(1) AS `Games`,
SUM(`points`) AS `Points`,
SUM(`points`) / SUM(1) AS `Points per Game`,
SUM(IF(`position` = 1, 1, 0)) AS `Wins`,
SUM(IF(`position` = 1, 1, 0)) / SUM(1) AS` Wins per Game`,
SUM(IF(`position` = 1, 0, 1)) AS `Loses`,
SUM(IF(`position` = 1, 0, 1)) / SUM(1) AS `Loses per Game`,
SUM(`kills`) AS `Kills`,
SUM(`kills`) / SUM(1) AS `Kills per Game`,
SUM(`death`) AS `Deaths`,
SUM(`death`) / SUM(1) AS `Deaths per Game`,
SEC_TO_TIME(SUM(`time`) / 1000) AS `Time played`,
ROUND(sqrt(SUM(`points`)) + 10 * SUM(`points`) / SUM(1) + 10 * sqrt(SUM(IF(`position` = 1, 1, 0))) + 100 * SUM(IF(`position` = 1, 1, 0)) / SUM(1) - 5 * sqrt(SUM(IF(`position` = 1, 0, 1))) - 50 * SUM(IF(`position` = 1, 0, 1)) / SUM(1) + 7.5 * sqrt(SUM(`kills`)) + 75 * SUM(`kills`) / SUM(1) - 3.75 * sqrt(SUM(`death`)) - 37.5 * SUM(`death`) / SUM(1), 2) AS `Score`
FROM
`sg_playerstats`
GROUP BY
`player`
ORDER BY
`Score` DESC,
`Points per Game` DESC,
`Wins per Game` DESC,
`Loses per Game` ASC,
`Kills per Game` DESC,
`Deaths per Game` ASC,
`Points` DESC,
`Wins` DESC,
`Loses` ASC,
`Kills` DESC,
`Deaths` ASC,
`Games` DESC,
`Time played` DESC,
`Player` DESC
) t;
END IF;
SELECT `Rank`, `Player`, `Games`, `Points`, `Points per Game`, `Wins`, `Wins per Game`, `Loses`, `Loses per Game`, `Kills`, `Kills per Game`, `Deaths`, `Deaths per Game`, `Time played`, `Score` INTO param1 FROM `sg_playerranking` WHERE 1
END;
这是我得到的错误:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4
好吧,如果我服用 DECLARE 也没关系!
(对不起,长查询!)
编辑2:
我终于解决了!此代码有效!
DELIMITER //
CREATE PROCEDURE gamestats ()
BEGIN
SET
@var1 = 1,
@var2 = 0;
SELECT
@var1 := `id`
FROM
`sg_playerstats`
ORDER BY
`id` DESC
LIMIT
0,
1;
SELECT
@var2 := `Last Updated`
FROM
`sg_playerranking`
LIMIT
0,
1;
IF
@var1 > @var2
THEN
TRUNCATE
`sg_playerranking`;
SET
@Rank := 0;
INSERT INTO
`sg_playerranking`
SELECT
@Rank := @Rank + 1 AS `Rank`,
t.*,
@var1 AS `Last Updated`
FROM
(
SELECT
`player` AS `Player`,
SUM(1) AS `Games`,
SUM(`points`) AS `Points`,
SUM(`points`) / SUM(1) AS `Points per Game`,
SUM(IF(`position` = 1, 1, 0)) AS `Wins`,
SUM(IF(`position` = 1, 1, 0)) / SUM(1) AS` Wins per Game`,
SUM(IF(`position` = 1, 0, 1)) AS `Loses`,
SUM(IF(`position` = 1, 0, 1)) / SUM(1) AS `Loses per Game`,
SUM(`kills`) AS `Kills`,
SUM(`kills`) / SUM(1) AS `Kills per Game`,
SUM(`death`) AS `Deaths`,
SUM(`death`) / SUM(1) AS `Deaths per Game`,
SEC_TO_TIME(SUM(`time`) / 1000) AS `Time played`,
ROUND(sqrt(SUM(`points`)) + 10 * SUM(`points`) / SUM(1) + 10 * sqrt(SUM(IF(`position` = 1, 1, 0))) + 100 * SUM(IF(`position` = 1, 1, 0)) / SUM(1) - 5 * sqrt(SUM(IF(`position` = 1, 0, 1))) - 50 * SUM(IF(`position` = 1, 0, 1)) / SUM(1) + 7.5 * sqrt(SUM(`kills`)) + 75 * SUM(`kills`) / SUM(1) - 3.75 * sqrt(SUM(`death`)) - 37.5 * SUM(`death`) / SUM(1), 2) AS `Score`
FROM
`sg_playerstats`
GROUP BY
`player`
ORDER BY
`Score` DESC,
`Points per Game` DESC,
`Wins per Game` DESC,
`Loses per Game` ASC,
`Kills per Game` DESC,
`Deaths per Game` ASC,
`Points` DESC,
`Wins` DESC,
`Loses` ASC,
`Kills` DESC,
`Deaths` ASC,
`Games` DESC,
`Time played` DESC,
`Player` DESC
) t;
END IF;
END;
//
DELIMITER ;