从多对多关系中选择按人气排序的标签

时间:2012-09-10 20:58:35

标签: mysql join group-by many-to-many

我有三张表有很多关系。表很简单:电影,标签和电影标签(下面的定义)。我希望用户能够看到最受欢迎的标签。这是有效的查询:

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;

1 个答案:

答案 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