【发布时间】:2011-12-09 10:55:13
【问题描述】:
我有一个游戏和价格数据库,我最近在其中发现了另一个问题。有些游戏在数据库中出现了两次——PC 版一次,Mac 版一次。如果一个游戏有两个这样的版本,我的数据库中不需要 mac 版本。但是,如果游戏只有 mac 版,我想保留它。
这个问题对我来说有点简单,因为所有也有 mac 版本的游戏都将使用完全相同的名称加上最后的小 sn-p 来表示它是为 mac 的。这可能采用“Left 4 Dead 2 (Mac)”、“Left 4 Dead 2 Mac”或“Left 4 Dead 2 [Mac 下载]”的形式。
为了尝试查找这些条目,我创建了以下查询:
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
我怎样才能加入这样的相等子字符串?
【问题讨论】: