mysql - 从多对多关系中选择按受欢迎程度排序的标签

标签 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.

许多电影都分配了许多标签。我希望用户能够选择他们最喜欢的标签。例如,如果用户从上面的列表中选择“ Action ”,则应该获得带有“ Action ”标签的电影中最受欢迎的标签。结果如下 - 仅带有“action”标签的电影:

comedy   120 10
thriller  88  5
western   62 21
drama     41  8

现在我无法调整上面的查询以使其具有 WHERE 子句而不会出现错误。如何仅选择和统计“ Action ”类别的电影?另外,我希望用户可以选择更多标签,例如选择带有“ Action ”、“惊悚片”和“喜剧”标签的电影,并按带有这些标签的电影数量排序。

表的定义:

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;

最佳答案

至于语法错误,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

关于mysql - 从多对多关系中选择按受欢迎程度排序的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12359363/

相关文章:

sql - 如何使此 CTE 查询打印具有 0 值的行?

php - 尝试解决 MySQL 查询逻辑问题的新手

mysql - Docker mysql 镜像 : periodic access denied for root

mysql - JDBC 中的 getExportedKeys() 返回 mysql 中的空集

mysql - 如何避免包含空值或零值的列

mysql - 同一个月两个不同的 SUMS

具有附加条件的 MySQL GROUP BY

java - mariadb 连接器 J Aurora 快速故障转移实现

python - 如果 Pandas 列不包含同一行中另一列的值,则在新行中添加另一列的值

mysql - MySQL中具有不同条件的多个聚合函数