0

我有三个具有多对多关系的表。表格很简单:电影、标签和电影标签(定义如下)。我希望用户能够看到最受欢迎的标签。这是工作查询:

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;
4

1 回答 1

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
于 2012-09-10T21:25:36.437 回答