отношение многие ко многим, что делает запрос менее сложным - PullRequest
0 голосов
/ 26 декабря 2011

Это просто пример дизайна таблиц, используемого в моей системе тегов.

ARTICLES
id
content

TAGS
id
tag

TAGSTOARTICLES
articleid
tagid

@ edit Наконец, после некоторого rubberducking Мне удалось написать следующеезапросы:


Просто выберите статьи:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags
FROM articles a
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id
LEFT JOIN tags t ON t.id = tta.tagid
GROUP BY a.id

Результат:

id  content         GROUP_CONCAT(t.tag)
1   Lorem ipsum 1   tag1,tag2
2   Lorem ipsum 2   tag1
3   Lorem ipsum 3   tag2

Поиск по тегам:

SELECT a.id, a.content, GROUP_CONCAT(t.tag) AS tags
FROM articles a
LEFT JOIN tagstoarticles tta ON tta.articleid = a.id
LEFT JOIN tags t ON t.id = tta.tagid
WHERE a.id IN (SELECT A.id FROM tagstoarticles M, articles A, tags T
               WHERE M.tagid = T.id
               AND (T.tag IN ('tag1'))
               AND A.id = M.articleid
               GROUP BY A.id
               HAVING COUNT( A.id )=1
)
GROUP BY a.id

Результат:

id  content         GROUP_CONCAT(t.tag)
1   Lorem ipsum 1   tag1,tag2
2   Lorem ipsum 2   tag1

Но запрос, используемый для поиска тегов, - беспорядок, есть идеи, чтобы решить эту проблему проще?

1 Ответ

1 голос
/ 26 декабря 2011

«Но как изменить этот запрос, чтобы выбрать все теги, назначенные этой статье одновременно?»

SELECT tag FROM tags INNER JOIN tagstoarticles ON tags.id = tagstoarticles.tagid WHERE articleid=[your article's id]

«А как это сделать, когда я просто хочу получить результаты без поиска по тегам?»

SELECT articles.id, tags.tag FROM articles INNER JOIN tagstoarticles ON tagstoarticles.articleid = articles.id INNER JOIN tags ON tagstoarticles.tagid = tags.id ORDER BY articles.id, articles.date

Это дает вам отдельную строку результатов для каждого тега, поэтому вам придется применить немного постобработки, чтобы преобразовать это в список статей с тегами. Однако, сортируя по идентификатору статьи, вы можете быть уверены, что все теги для одной статьи возвращаются вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...