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)
этот запрос должен быть довольно хорошо оптимизирован.