Mysql WHERE NOT EXISTS不适用于尾随空格

Mysql WHERE NOT EXISTS不适用于尾随空格,mysql,sql,subquery,Mysql,Sql,Subquery,我正在运行命令SELECT distinct winner FROM history WHERE NOT existence SELECT*FROM players WHERE players.name=history.winner 如果history.winner类似于Test,那么它似乎会失败。注意尾随空格和players.name已经有了Test 对于不区分大小写,我也有同样的问题,所以我将两个字段排序都设置为latin1_general_cs,如果这起到任何作用的话。我认为解决方案可能会

我正在运行命令SELECT distinct winner FROM history WHERE NOT existence SELECT*FROM players WHERE players.name=history.winner

如果history.winner类似于Test,那么它似乎会失败。注意尾随空格和players.name已经有了Test

对于不区分大小写,我也有同样的问题,所以我将两个字段排序都设置为latin1_general_cs,如果这起到任何作用的话。我认为解决方案可能会导致使用BINARY关键字,但是

从不存在的历史中选择不同的二进制赢家从二进制玩家中选择*。name=history.winner使查询速度非常慢,以至于我在1分钟后退出。

您可以使用该函数完成以下操作:

SELECT DISTINCT h.winner 
FROM history h
WHERE NOT EXISTS 
(
  SELECT * 
  FROM players p  
  WHERE Trim(p.name) = Trim(h.winner)
)
mysql TRIM函数将从特定字段中去除前导空格和尾随空格

SELECT distinct winner FROM history WHERE NOT EXISTS (SELECT * FROM players WHERE players.name = TRIM(history.winner))
如果只想修剪尾随空格,可以使用RTRIM


我认为它的运行速度与二进制文件一样慢,因为它需要多次运行trim。是的,您可以通过更改数据库的结构来缓解这一问题。使用主键和外键引用一个名字,而不是实际的名字/赢家。这实际上是我正在尝试做的,我手边不知道球员的名字,所以它扫描历史并将他们插入球员表。然后我有一个修改过的历史记录,它使用player.id而不是player.name-似乎将name设置为唯一键更容易,然后插入IGNORE和just bruteforce将所有获奖者插入players表您还可以通过提前更新历史记录和players表来减轻一直使用Trim功能的负担。类似于更新玩家集name=Trimname和更新历史集winner=trimnowner。那么您就不需要在上面的SELECT语句中使用Trim了。后面的空格很重要,Test和Test应该是唯一的。这似乎与mysql的插入方式有关,因为它说1062-重复条目“Test”作为键“name”,但Test并不存在,但Test确实存在。