У меня есть база данных игр и цен, в которой я недавно обнаружил еще одну проблему. Есть несколько игр, которые появляются в базе данных дважды - один раз для версии для ПК и один раз для версии для 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()
, похоже, не работает вообще. В базе данных с примерно 8000 записей было получено около 64 миллионов результатов. Очевидно, что он полностью пропускает линию SUBSTR(g1.title,0,20) = SUBSTR(g2.title,0,20)
и присоединяется к строкам в любое время g1.title<>g2.title
Как я могу присоединиться к таким же подстрокам, как это?