Объединение по равной подстроке?

#mysql #join #substring

#mysql #Присоединиться #подстрока

Вопрос:

У меня есть база данных игр и цен, в которой я недавно обнаружил еще одну проблему. Есть некоторые игры, которые появляются в базе данных дважды — один раз для версии для ПК и один раз для версии для Mac. Если есть две такие версии игры, мне не нужна версия mac в моей базе данных. Однако, если существует ТОЛЬКО версия игры для Mac, я хотел бы сохранить ее.

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

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

Ответ №1:

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

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

Комментарии:

1. 1 хорошее место. Для ясности, это не пропуск , это ошибка кодирования.