2017-02-16 30 views
1

Я пытаюсь вытащить результаты, когда 1 строка из tableA (profiles.category) соответствует 1 строке из tableB (projects.categorysecond), однако я не получаю результатов.SQL/PHP find_in_set

* ВАЖНО Проекты.Категории могут варьироваться в зависимости от того, существует ли только одна категория для нескольких категорий, разделенных; ПРИМЕР: OTTAWA ИЛИ OTTAWA; TORONTO; MONTREAL ИЛИ OTTAWA; MONTREAL ИЛИ TORONTO; MONTREAL

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

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

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#function_find-in-set

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

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

я должен прокомментировать, что это не лучший способ для хранения данных, если вы хотите написать выражения, которые находят отдельные слова в строке, разделенной точкой с запятой. См. my answer to Is storing a delimited list in a database column really that bad?

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

+1

Ничего себе, теперь я чувствую себя немым. Большое спасибо. Я не знал, что он понимает только запятую. Кроме того, спасибо за второе предложение о том, как лучше сделать запрос/таблицу. – SiREKT