MYSQL REGEXP / RLIKE Советы?

0

У меня есть таблица под названием "стипендии", в которой есть поле под названием "майоры", которое содержит разделенные запятыми основные имена для основных специальностей, которые связаны с стипендией.

Скажем, поле может содержать один (или более разделенный запятыми): бизнес, агробизнес, деловое администрирование, международный бизнес.

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

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

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[[:>:]]$'

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

Любые советы?

Теги:
codeigniter
rlike

3 ответа

2

Любые советы?

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

  • Определите таблицу MAJORS:

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

    SCHOLARSHIP_MAJORS

    • SCHOLARSHIP_ID (первичный ключ, внешний ключ для таблицы SCHOLARSHIPS)
    • MAJOR_ID (первичный ключ, внешний ключ для таблицы MAJORS)
  • Используйте JOINs для получения стипендий на основе майоров:

    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

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

Бенчмаркинг показал, что это хороший способ с упрощенным синтаксисом:

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

Поле, о котором идет речь, должно быть строковым полем CSV. Идеальное решение для моей проблемы. Да, я признаю, что многие из многих таблиц являются более нормализованным способом.

0

Я смог улучшить 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню