Присоединиться к одинаковой подстроке? - PullRequest
1 голос
/ 17 октября 2011

У меня есть база данных игр и цен, в которой я недавно обнаружил еще одну проблему. Есть несколько игр, которые появляются в базе данных дважды - один раз для версии для ПК и один раз для версии для 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

Как я могу присоединиться к таким же подстрокам, как это?

1 Ответ

3 голосов
/ 17 октября 2011

SUBSTR () в том виде, в каком вы его используете, индексируется одним индексом, а не нулевым. Вы хотите

SUBSTR(g1.`title`,1,20) = SUBSTR(g2.`title`,1,20)
...