我有三张表有很多关系。表很简单:电影,标签和电影标签(下面的定义)。我希望用户能够看到最受欢迎的标签。这是有效的查询:
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
所以结果就像(标签名,计数,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;
答案 0 :(得分:2)
至于语法错误,WHERE在GROUP BY:
之前SELECT tags.tag, COUNT( * ) AS c, tags.id
FROM tags
LEFT JOIN movietags ON tags.id = tagid
WHERE tags.id =5
GROUP BY tags.id
ORDER BY c DESC