我的Select查询中有以下MySQL代码
FIND_IN_SET(`Final Total`, (
SELECT GROUP_CONCAT( DISTINCT `Final Total`
ORDER BY `Final Total` ASC ) FROM `Dressage scores`)) AS `Final Rank`,我正在尝试找出一种方法,如果代码在Final Rank字段中看到该记录的W或E,但在表中的所有其他记录上执行,则停止执行该代码。
所以我试着用这样的东西来测试
IF (`Final Rank` == "E") THEN FIND_IN_SET(`Final Total`, (
SELECT GROUP_CONCAT( DISTINCT `Final Total`
ORDER BY `Final Total` ASC ) FROM `Dressage scores`)) AS `Final Rank`,我也尝试过这样的东西
FIND_IN_SET(`Final Total`, (
SELECT GROUP_CONCAT( DISTINCT `Final Total`
ORDER BY `Final Total` ASC ) FROM `Dressage scores`)) AS `Final Rank` WHERE `Final Rank` <> "E",但我显然需要一些帮助。
这是针对竞赛评分系统的,因此如果某个记录退出(W)或被淘汰( E ),我希望能够手动在Final Rank字段中插入W或E,然后让系统仅对不包含W或E的记录进行排名。
有人能帮我解决这个问题吗?
发布于 2021-07-18 01:39:04
让我们通过以下方式加快速度
EXISTS( SELECT 1 FROM `Dressage scores`
WHERE `Final Total` = `outer table`.`Final Total` )我对你的“最终排名”测试很困惑。也许:
IF (FIND_IN_SET(`Final Rank`, "E,W"),
false,
EXISTS( SELECT 1 FROM `Dressage scores`
WHERE `Final Total` = `outer table`.`Final Total` )
)请注意,MySQL使用=,而不是==。
显然,您希望从表达式中返回true/false值?这就是你的表达式正在做的,我的也是。
EXISTS( SELECT 1 ...)很快,因为它在找到匹配项时停止为TRUE --无需扫描整个表或构建临时表。ORDER BY和DISTINCT是额外的、不必要的工作。
EXISTS返回true/false。
IF(boolean-test, value if true, value if false) --我的示例中的两个值都是true/false。
我很确定IF()是“短路”的。另一种可能的短路:
NOT FIND_IN_SET(`Final Rank`, "E,W")
OR EXISTS( SELECT 1 FROM `Dressage scores`
WHERE `Final Total` = `outer table`.`Final Total` )为了进一步讨论,请提供数据的一小部分案例,以及每个案例所需的真/假。
https://stackoverflow.com/questions/68425584
复制相似问题