Сложный подзапрос - это возможно? - PullRequest
3 голосов
/ 18 сентября 2010

У меня есть 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)

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

1 Ответ

6 голосов
/ 18 сентября 2010

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

У вас должна быть такая схема:

     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 является соединительной таблицей .Теперь вы можете получить все статьи с данным тегом (если вы знаете tag_id, вам даже не понадобится JOIN):

    SELECT article_id, ...
      FROM articles_tags
INNER JOIN tags ON tags.tag_id = articles_tags.tag_id
     WHERE tag_name = 'TAGNAME'
...