2010-05-18 2 views
0

У меня есть таблица Dómкак вопрос оператора

select * from dom 

дом табличные данные:

id name  skills 
1  dom  c,c++ 

Здесь я хочу, чтобы получить запрос с использованием как оператора

select * from dom where skills like '%c,c++%' 

Тогда я получил желаемого результат, это не проблема.

Предположим, что я хочу использовать приведенный ниже запрос

select * from dom where skills like '%C++,C%' 

я не получил результата.

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

Как я могу это сделать?

ответ

12

для того, чтобы обрабатывать все возможные случаи (начало строки, конец строки, между 2-разделителей), Вам необходимо будет неэффективным (не может использовать индекс)

SELECT * 
FROM dom 
WHERE CONCAT(',', skills, ',') LIKE '%,C,%' 
     AND CONCAT(',', skills, ',') LIKE '%,C++,%' 

Лучший ответ будет поместите свою базу данных как минимум в first Normal Form!

отдельный стол и навыки навыков/человек матрица таблица является гораздо более эффективным для поиска и проще работать (например, удаление индивидуального мастерства)

Если вам нужен запрос, который будет вернуть записи в DOMS, которые соответствуют как C и C++ (предполагая такую ​​же схему, как jimmy_keen's answer), это может быть сделано с автообъединением получить пересечение, оператор пересекаться, или с помощью other relational division techniques, таких как

SELECT d.name 
FROM dom d 
     JOIN dom_skills ds 
     ON (d.id = ds.id_dom) 
     JOIN skills s 
     ON (ds.id_skill = s.id) 
WHERE s.name IN ('C', 'C++') 
GROUP BY d.id, 
      s.id, 
      d.name 
HAVING COUNT(DISTINCT s.name) = 2 
0

Вы должны использовать полнотекстовый поиск или перепроектировать вашу схему с помощью экстрактов ng в отдельную таблицу и имеют отношение M: N между таблицами Skill и Dom.

2

Столбец «Навыки» выглядит как нечто, что вы можете сопоставить с отношением «многие ко многим» с вашим оригинальным «домашним» столом. Например:

SKILLS  DOM   DOM_SKILLS 
id | name id | name id_dom | id_skill 
---'----- ---'----- -------'--------- 
1 | C  1 | dom  1 | 1 
2 | C++     1 | 2 

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

SELECT d.name, s.name 
FROM dom d 
JOIN dom_skills ds ON (d.id = ds.id_dom) 
JOIN skills s ON (ds.id_skill = s.id) 
WHERE s.name LIKE '%C%' OR s.name LIKE '%C++' 

... но ваша схема будет легче управлять (думать о повторяющихся записей, обновление и т.д. нормальная форма, которая в настоящий момент нарушена вашей схемой).

+0

+1. Я бы пошел на 'WHERE s.name в ('C', 'C++')' хотя. –