2016-10-24 5 views
0
  • У меня есть таблица MySQL, которая содержит вопросы для пользователей.
    • Каждый пользователь имеет категорию, назначенную им.
    • Каждый вопрос может быть нацелен на одну или несколько категорий пользователей.
    • Категория вопроса находится в столбце в таблице вопросов, а - не в отдельной таблице.
    • По вопросам, которые нацелены на несколько категорий пользователей, каждая категория будет отделена от персонажа, таких как |

Я пытаюсь получить все вопросы из таблицы, где категория конкретного пользователя совпадает строки, которая находится в столбце категории для вопроса.Соответствующие слова в строке

Я столкнулся пару вопросов:

$string^ не будет работать, потому что строка я пытаюсь сравнить с может быть что-то вроде Retail|Field Based

Я не могу использовать WHERE category LIKE "%'.$category.'%" потому, что некоторые категории поделиться словами. Например: Retail и Retail Roadshow Если Retail была категория, она будет также соответствовать на Retail Roadshow

Я на немного потери о том, как сделать это с текущей структурой базы данных. Я не планирую изменять структуру базы данных, но, возможно, придется, если я не смогу получить рабочий ответ о том, как он работает в настоящее время.

+3

Ваш инстинкт верен, таблица MySQL не должна содержать каких-либо разделительных данных, каждое значение должно существовать в отдельной строке в другой таблице е. Следуйте этому принципу, и многие проблемы, которые вы на грани столкновения, исчезнут. –

+2

Если вы хотите сохранить трубопровод '' ', то вы можете сделать это' $ sql = "select * from your_table, где category = '$ category' или category like '$ category |%' или category LIKE '% | $ category |% 'или category like'% | $ category '";' – MonkeyZeus

+0

Что происходит, когда категория пользователя действительно имеет канал в названии категории? – MonkeyZeus

ответ

0

Как уже упоминалось, базы данных работают лучше всего с таблицами.

Но, ради аргумента, давайте посмотрим, как мы можем достичь вашей цели без какого-либо рефакторинга БД.

Прежде всего, вам нужно будет заменить все ваши трубы запятыми.

replace(column, '|', ',') 

Теперь используйте FIND_IN_SET по результатам:

find_in_set('Retail', replace(column, '|', ',')) 

MySQL индексы начинаются с 1, так что вы можете проверить, если Rrtail существует в колонке с:

find_in_set('Retail', replace(column, '|', ',')) > 0 
2

У вас есть три варианта:

1) разделить подстановочные знаки на одно слово:

foo LIKE '%bar baz%' ->foo LIKE '%bar%' AND foo LIKE '%baz%'

2) Используйте полнотекстовый индекс

foo like '%bar baz%' ->MATCH(foo AGAINST 'bar baz')

3) Или нормализовать таблицу таким образом, каждое ключевое слово является его собственный ребенок запись:

JOIN keywords ON ... 
WHERE keywords.word IN ('bar', 'baz') 
+0

Вариант нормализации, вероятно, лучше всего работает здесь. 'LIKE', как известно, медленный. – tadman

+0

№. это не «как». это анкерная подстановка. '% foo%' медленный, потому что использование индекса невозможно. 'foo%' может (обычно) использовать индексы. и 'like 'foo'' является эквивалентом' field =' boo'' в любом случае. –

+0

Правда, но использование 'LIKE' без якорей довольно бессмысленно. – tadman

Смежные вопросы