Я пытаюсь сделать запрос возвратить 3 статьи, связанные с тем, который читает пользователь. Для этого я создал табличку с набором тегов, относящихся ко всем статьям (до 5 тегов).
Вот что у меня есть:
CREATE TABLE IF NOT EXISTS `j_news` (
`n_id` smallint(5) NOT NULL AUTO_INCREMENT,
`n_title` varchar(94) COLLATE utf8_danish_ci NOT NULL,
`n_text` text COLLATE utf8_danish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=25 ;
CREATE TABLE IF NOT EXISTS `j_news_tags` (
`nt_id` mediumint(7) NOT NULL AUTO_INCREMENT,
`nt_news_id` mediumint(7) NOT NULL,
`nt_tag` varchar(24) COLLATE utf8_danish_ci NOT NULL,
PRIMARY KEY (`nt_id`),
KEY `nt_news_id` (`nt_news_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=1 ;
Если вы действительно рассматриваете производительность Я бы предложил вам прочитать этот вопрос. Я когда-то был. Он имеет дело с большими базами данных и имеет ориентиры по различным запросам (все относятся к тегам).
Чтобы сократить его, SQL будет выглядеть следующим образом:
SELECT DISTINCT p . *
FROM projects p
JOIN projects_to_tags pt ON pt.project_id = p.num
JOIN projects_to_tags x ON x.tag_id = pt.tag_id
AND x.project_id = x -- x is your project ID number