【发布时间】:2012-09-03 18:32:39
【问题描述】:
我有三个具有多对多关系的表。表格很简单:电影、标签和电影标签(定义如下)。我希望用户能够看到最受欢迎的标签。这是有效的查询:
SELECT tags.tag, COUNT( * ) AS c, tags.id
FROM tags
LEFT JOIN movietags ON tags.id = tagid
GROUP BY tags.id
ORDER BY c DESC
所以结果就像 (tag name, count, tags.id)
action 450 2
comedy 300 10
drama 280 8
thriller 250 5
etc.
许多电影都分配了许多标签。我希望用户能够选择他们最喜欢的标签。例如,如果用户从上面的列表中选择“动作”,则应该在带有“动作”标签的电影中获得最受欢迎的标签。结果将如下所示 - 仅带有“动作”标签的电影:
comedy 120 10
thriller 88 5
western 62 21
drama 41 8
现在我无法调整上面的查询以使 WHERE 子句没有错误。如何仅选择和计算具有“动作”类别的电影?另外,我希望用户从更多标签中进行选择,例如选择带有“动作”、“惊悚”和“喜剧”标签的电影,也可以按带有这些标签的电影数量排序。
表格定义:
CREATE TABLE `movie` (
`id` int(10) unsigned,
`title` varchar(250),
`tags` varchar(250),
`category` varchar(250),
KEY `id` (`id`)
) ENGINE=MyISAM;
CREATE TABLE `movietags` (
`tagid` int(10) unsigned,
`movieid` int(10) unsigned,
UNIQUE KEY `tagid_2` (`tagid`,`movieid`),
KEY `mainid` (`movieid`),
KEY `tagid` (`tagid`)
) ENGINE=MyISAM;
CREATE TABLE `tags` (
`id` int(10) unsigned auto_increment,
`tag` varchar(250),
PRIMARY KEY (`id`),
UNIQUE KEY `tag` (`tag`)
) ENGINE=MyISAM;
【问题讨论】:
-
#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'WHERE tags.id=5 附近使用正确的语法查询是:SELECT tags.tag, COUNT( * ) AS c, tags.id FROM tags LEFT JOIN movietags ON tags .id = tagid GROUP BY tags.id ORDER BY c DESC WHERE tags.id =5
标签: mysql join group-by many-to-many