2010-09-18 2 views
3

У меня есть 2 таблицы: один хранит теги, другие магазины. Есть режим «Получить статьи по тегу», который в основном принимает все статьи с меткой «x». В моей таблице статей я использую файл с именем Tags, который хранит данные в таком шаблоне «tag1, tag2, tag3, ...».Сложный подзапрос - это возможно?

Так что я хочу, чтобы все работы лишь на один запрос вроде этого:

SELECT *, 
     (SELECT tagname 
      FROM `tags_table` 
     WHERE tagurn LIKE 'x') as TAGNAME 
    FROM `articles_table` 
WHERE (Tags LIKE 'TAGNAME,%' OR Tags LIKE '%, TAGNAME' ... and so on) 

Я не знаю, если это вообще возможно, но я бы очень хотел, чтобы использовать один запрос (с sub-query) вместо двух разных.

ответ

6

Это неправильный способ хранения отношений «многие ко многим» в базе данных.

Вы должны иметь схему, как:

 articles: [PK] article_id, ... (should have no reference to tags) 
     tags: [PK] tag_id, tag_name, ... 
articles_tags: [FK] article_id, [FK] tag_id 

[PK] = первичный ключ, [FK] = внешнего ключа

Где articles_tags является junction table. Теперь вы можете получить все статьи с данным тегом с (если вы знаете tag_id вы даже не будете нуждаться в JOIN):

SELECT article_id, ... 
     FROM articles_tags 
INNER JOIN tags ON tags.tag_id = articles_tags.tag_id 
    WHERE tag_name = 'TAGNAME' 
Смежные вопросы