MYSQL REGEXP / RLIKE Советы? - PullRequest
       16

MYSQL REGEXP / RLIKE Советы?

0 голосов
/ 03 сентября 2010

У меня есть таблица, называемая «стипендии», в которой есть поле с именем «майоры», содержащее основные имена, разделенные запятыми, для тех специальностей, с которыми стипендия также связана.через запятую): бизнес, агробизнес, бизнес-администрирование, международный бизнес.

Если кто-то ищет «бизнес» в качестве основного, как я могу выбрать «бизнес» в качестве соответствия, но не другие?

Самое близкое, что я пришел, - это, но я знаю, что могло бы быть и лучше - моя способность к регулярным выражениям не так уж высока.

SELECT scholarship_id, scholarship_award_name, scholarship_majors 
FROM scholarships 
WHERE scholarship_majors rlike '[, ][[:<:]]business[[:>:]][, ]'
OR scholarship_majors rlike '^[[:<:]]business[[:>:]][, ]'
OR scholarship_majors rlike '[, ][[:<:]]business[[:>:]]$'

Я пытаюсь поймать поле, если ононачинается с «бизнес» или «бизнес» или «бизнес», «бизнес», но не с «бизнес-администрирование» и т. д.

Любой совет?

Ответы [ 3 ]

2 голосов
/ 03 сентября 2010

Какой совет?

Не храните данные в разделенных запятыми списках - это денормализованные данные и, кроме того, что их трудно выделить, они также подвержены ошибочным данным (опечатки, чувствительность к регистру ...).

  1. Определение таблицы MAJORS:

    • MAJOR_ID (первичный ключ)
    • MAJOR_NAME
  2. Используйте таблицу «многие ко многим», чтобы присоединить стипендии к одному или нескольким специальностям:

    SCHOLARSHIP_MAJORS

    • SCHOLARSHIP_ID (первичный ключ, внешний ключ к таблице SCHOLARSHIPS)
    • MAJOR_ID (первичный ключ, внешний ключ к таблице MAJORS)
  3. Используйте СОЕДИНЕНИЯ для получения стипендий по специальностям:

    SELECT s.scholarship_id, 
           s.scholarship_award_name, 
           m.major_name
      FROM SCHOLARSHIPS s
      JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id
      JOIN MAJORS m ON m.major_id = sm.major_id
     WHERE m.major_name IN ('a', 'b', 'c')
    

... если вы хотите, чтобы основные данные выводились в списке через запятую, используйте функцию GROUP_CONCAT:

    SELECT s.scholarship_id, 
           s.scholarship_award_name, 
           GROUP_CONCAT(m.major_name) AS majors
      FROM SCHOLARSHIPS s
      JOIN SCHOLARSHIP_MAJORS sm ON sm.scholarship_id = s.scholarship_id
      JOIN MAJORS m ON m.major_id = sm.major_id
     WHERE m.major_name IN ('a', 'b', 'c')
  GROUP BY s.scholarship_id, s.scholarship_award_name
0 голосов
/ 04 сентября 2010

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

Сравнительный анализ показал, что это хороший способ с более простым синтаксисом:

SELECT * FROM table WHERE FIND_IN_SET('string', my_field)

Рассматриваемое поле ДОЛЖНО быть строковым полем CSV. Идеальное решение для моей проблемы. Да, я признаю, что таблицы «многие ко многим» более нормализованы.

0 голосов
/ 03 сентября 2010

Мне удалось улучшить sql, запретив такие буквенные символы, как:

SELECT scholarship_id, scholarship_award_name, scholarship_majors 
FROM scholarships 
WHERE scholarship_majors rlike '[, ][^a-z][[:<:]]business[[:>:]][^a-z][, ]'
OR scholarship_majors rlike '^[[:<:]]business[[:>:]][^a-z][, ]'
OR scholarship_majors rlike '[, ][^a-z][[:<:]]business[[:>:]]$'

Это похоже на то, на что я надеюсь!

Все еще ищу любой советулучшить этот оператор SQL.

...