我有一个游戏和价格数据库,我最近发现了另一个问题。有些游戏会在数据库中出现两次 - 一次是PC版,一次是Mac版。如果有两个这样的游戏版本,我不需要我的数据库中的mac版本。但是,如果只有游戏的mac版本,我想保留它。
这个问题对我来说有点简单,因为所有拥有mac版本的游戏都将使用完全相同的名称加上最后一个小片段来表示它是针对mac的。这可能采用“Left 4 Dead 2(Mac)”,“Left 4 Dead 2 Mac”或“Left 4 Dead 2 [Mac Download]”的形式。
为了尝试找到这些条目,我创建了以下查询:
SELECT *
FROM `gamelist` g1
JOIN `gamelist` g2
ON
SUBSTR(g1.`title`,0,20) = SUBSTR(g2.`title`,0,20)
AND
g1.`title`<>g2.`title`
WHERE
(g1.`amazon_id` IS NOT NULL AND g2.`amazon_id` IS NOT NULL)
OR (g1.`steam_id` IS NOT NULL AND g2.`steam_id` IS NOT NULL)
OR (g1.`impulse_id` IS NOT NULL AND g2.`impulse_id` IS NOT NULL)
...
这个想法应该相当简单。问题是SUBSTR()
似乎根本不起作用。在一个包含约8,000个条目的数据库中,它返回了大约6400万个结果。显然,它会完全跳过SUBSTR(g1.title,0,20) = SUBSTR(g2.title,0,20)
行并随时加入行g1.title<>g2.title
我如何加入像这样的相等子串?
答案 0 :(得分:3)
SUBSTR(),以您使用它的方式,是一个索引,而不是零索引。你想要
SUBSTR(g1.`title`,1,20) = SUBSTR(g2.`title`,1,20)