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

0

Предположим, что эти две таблицы:

блог

id title      keywords
1  Hello      hello,world,test
2  Google     search, email, security
3  Microsoft  clippy, collaboration

категория

id keywords
1  test, world, clippy

Как искать строки блога, которые имеют одно или несколько ключевых слов, соответствующих ключевому слову в строке категории?

  • 5
    Есть ли шанс, что вы можете изменить эту модель данных? Там будут лучшие способы хранения этого, чтобы обеспечить более эффективный поиск.
  • 0
    Сверх того, я не уверен, но я думаю, что функция susbtring, вероятно, будет очень полезна для вас. Дополнительные строковые функции здесь: dev.mysql.com/doc/refman/5.0/en/string-functions.html Долгосрочным решением будет рефакторинг ключевых слов в отдельную таблицу, а затем использование таблицы blogs_keywords для хранения пар идентификатора блога и идентификатор ключевого слова
Показать ещё 3 комментария
Теги:

2 ответа

1
Лучший ответ

Кратко: если вы хотите выполнить эту операцию, вы не храните свои данные так. Вы нормализуете свои данные и выполняете поиск с использованием нормализованных данных:

CREATE TABLE Blog
(
    id      INTEGER NOT NULL PRIMARY KEY,
    title   VARCHAR(30) NOT NULL
);

INSERT INTO Blog(id, title) VALUES(1, 'Hello');
INSERT INTO Blog(id, title) VALUES(2, 'Google');
INSERT INTO Blog(id, title) VALUES(3, 'Microsoft');

CREATE TABLE BlogKeywords
(
    id      INTEGER NOT NULL,
    keyword VARCHAR(20) NOT NULL,
    PRIMARY KEY(keyword, id)
);

INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'hello');
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'world');
INSERT INTO BlogKeywords(id, keyword) VALUES(1, 'test');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'search');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'email');
INSERT INTO BlogKeywords(id, keyword) VALUES(2, 'security');
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'clippy');
INSERT INTO BlogKeywords(id, keyword) VALUES(3, 'collaboration');

CREATE TABLE Category
(
    id      INTEGER NOT NULL,
    keyword VARCHAR(20) NOT NULL,
    PRIMARY KEY(id, keyword)
);

INSERT INTO Category(id, keyword) VALUES(1, 'test');
INSERT INTO Category(id, keyword) VALUES(1, 'world');
INSERT INTO Category(id, keyword) VALUES(1, 'clippy');

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

SELECT DISTINCT b.id AS BlogID, b.Title, c.id AS CategoryID
  FROM Blog AS b
  JOIN BlogKeywords AS K ON b.id      = k.id
  JOIN Category     AS C ON k.keyword = c.keyword;

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

0

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

Ещё вопросы

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