SQL/PHP find_in_set

Я пытаюсь получить результаты, где 1 строка из таблицы A (profiles.category) соответствует 1 строке из таблицы B (projects.categorysecond), однако я не получаю результаты.

* ВАЖНО projects.categorysecond будет варьироваться от одной категории к нескольким категориям; ПРИМЕР: ОТТАВА ИЛИ ОТТАВА; ТОРОНТО; МОНРЕАЛЬ ИЛИ ОТТАВА; МОНРЕАЛЬ ИЛИ ТОРОНТО; МОНРЕАЛЬ

profiles.category всегда будет иметь только 1 категорию, никогда не исключается.

Мне нужно убедиться, что независимо от того, есть ли у меня OTTAWA ИЛИ OTTAWA; TORONTO; MONTREAL в profiles.category, он вытягивает результаты, если найдено 1 слово.

В настоящее время я пытаюсь следующий запрос:

SELECT p.*, up.* FROM users_profiles up INNER JOIN projects p ON find_in_set(up.category, p.categorysecond) > 0

1 ответ

Решение

FIND_IN_SET() понимает только запятую как разделитель. Прочитайте https://dev.mysql.com/doc/refman/5.7/en/string-functions.html

Таким образом, вы могли бы заменить ; с , а затем сделайте сравнение:

SELECT p.*, up.* 
FROM users_profiles up 
INNER JOIN projects p 
  ON FIND_IN_SET(up.category, REPLACE(p.categorysecond, ';', ',')) > 0

Я должен прокомментировать, что это не очень хороший способ хранения данных, если вы хотите написать выражения, которые находят отдельные слова в вашей строке, разделенной точкой с запятой. См. Мой ответ на вопрос: действительно ли плохо хранить список с разделителями в столбце базы данных?

Вы должны хранить одну категорию проекта на строку в project_categories Таблица. Тогда ваш запрос будет проще:

SELECT p.*, up.* 
FROM users_profiles up 
INNER JOIN project_categories pc
  ON up.category = pc.category
INNER JOIN projects p 
  ON p.project = pc.project;

С составным индексом на project_categories(category,project)этот запрос должен быть довольно хорошо оптимизирован.

Другие вопросы по тегам