2012-04-07 2 views
1

у меня есть posts таблиц структурированы таким образом:связанное Retrievng сообщений по ключевым словам

id | title | content | tags 

и стол tags

id | name | description 

Я положил свои теги в posts таблицы так: 3,2,5,8 где число представляют собой номер строки таблицы tags. Теперь, что мог бы мне выбрать подходящие записи в моем посте по своим тегам?

SELECT * FROM posts WHERE tags ? LIMIT 10 

Я довольно плохо разбираюсь в логике.

ответ

3

Это где базы данных Нормализация приходит Сохранение нескольких тегов идентификаторов в одном столбце не является хорошей идеей.. Вероятно, вы должны создать новую таблицу post_tags со структурой post_id | tag_id, чтобы связать несколько тегов с одним сообщением.

Вы можете выполнить следующий запрос:

SELECT * FROM posts 
INNER JOIN post_tags ON post_tags.post_id = posts.id 
WHERE post_tags.tag_id IN(id1,id2,etc.) 
+0

Так что в целом три стола будут? – Michelle

+0

Точно, будут три таблицы: 'posts',' tags' и 'post_tags' – Config

+0

Не могли бы вы помочь мне разобраться в последних двух строках кода? – Michelle

0
SELECT * FROM posts WHERE tags IN (YOUR_COMMA_SEPRATED_TAG_IDS); 

YOUR_COMMA_SEPRATED_TAG_IDS может быть: - 1 OR 1,2,3 или что-нибудь еще ...

2

Вы бы лучше изменить дизайн дб. Создайте новую таблицу для отношения сообщений и тегов.

create table post_tags (
    post_id int, 
    tag_id int 
) 

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

SELECT 
    p.* 
FROM 
    posts p 
LEFT JOIN 
    post_tags pt ON p.id = pt.post_id 
WHERE 
    pt.tag_id IN (?,?,?) 
+0

Какой дизайн вы предлагаете? Я был бы очень признателен, – Michelle

+0

@JackSpairow Я уже приводил пример в сообщении. – xdazz

+0

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

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