【问题标题】:Select tags ordered by popularity from many to many relation从多对多关系中选择按受欢迎程度排序的标签
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 要让人们选择多个标签,请使用:WHERE tags.id in (5,6,7,8)。 IN 子句很难参数化。
  • 谢谢,现在没有语法错误!但是我现在得到的是只有一行的结果,带有这个标签 ID 和计数的电影。如果我使用 WHERE ...IN 我只会得到具有指定 ID 的条目,因此是初始查询的一部分,这对我来说现在是合乎逻辑的。我想得到的是在其他标签中包含这些标签的电影列表。
  • select * from movies m, movietags t where m.id = t.movi​​eid and t.id in (5,6,7,8)
  • 谢谢,这个我已经有了。问题是我需要计算有多少电影有这些标签并按受欢迎程度排序。例如,如果我选择标签 id 5,6——例如“动作”和“喜剧”,我想看看有哪些不同的标签有这两个标签的电影,也按受欢迎程度(计数)排序。
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 2016-03-10
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2015-09-10
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多