首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL查询--如何获取相关标记数量的计数

MySQL查询--如何获取相关标记数量的计数
EN

Stack Overflow用户
提问于 2012-10-16 17:39:24
回答 1查看 161关注 0票数 2

我很难找到一种查询所需数据的好方法。我使用的是mySQL和php。目前,我正在进行多个查询,并对每个循环使用了一堆,但是,我仍然无法获得必要的输出。

这可能是一个很难回答的问题,所以我很感谢任何努力去解决这个问题的人!

我目前的表格如下:

代码语言:javascript
复制
topics_keywords (t_k_id, topic_id, keyword_id)
keywords (keyword_id, keyword)
topics (topic_id, subject, etc)

topics_keyword将具有与同一topic_id相关联的多个关键字。

keywords将只为每个keyword_id定义一个关键字。

如果有人查询特定的关键字(即体育),我想返回与topic_id相关的所有相关关键字的列表。

在下面的SQL中,您将看到主题3与关键字_id的3(体育运动)和4(棒球)相关联。但是,请注意,它也与keyword_id 2(hello)相关联。

我只需要统计一下多少次“运动”与棒球有关。我说的很简单,但我想不出一个简单的方法。

根据下面的数据,最终的输出需要如下所示:

搜索词:“棒球”最终输出:

代码语言:javascript
复制
count  | keyword
----------------
sports | 2
hello  | 1

下面是一些帮助查看数据的mySQL:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS `keywords` (
  `keyword_id` int(11) NOT NULL AUTO_INCREMENT,
  `keyword` varchar(64) NOT NULL,
  PRIMARY KEY (`keyword_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Dumping data for table `keywords`
--

INSERT INTO `keywords` (`keyword_id`, `keyword`) VALUES
(1, 'thebump'),
(2, 'hello'),
(3, 'baseball'),
(4, 'sports'),
(5, 'manga'),
(6, 'naruto'),
(7, 'one piece');

-- --------------------------------------------------------

--
-- Table structure for table `topics_keywords`
--

CREATE TABLE IF NOT EXISTS `topics_keywords` (
  `t_k_id` int(11) NOT NULL AUTO_INCREMENT,
  `topics_id` int(11) NOT NULL,
  `keyword_id` int(11) NOT NULL,
  PRIMARY KEY (`t_k_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Dumping data for table `topics_keywords`
--

INSERT INTO `topics_keywords` (`t_k_id`, `topics_id`, `keyword_id`) VALUES
(1, 1, 1),
(2, 2, 2),
(3, 3, 3),
(4, 3, 4),
(5, 4, 3),
(6, 5, 3),
(7, 5, 4),
(8, 6, 3),
(9, 6, 4),
(10, 3, 2);

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-16 17:55:47

试试这个:

代码语言:javascript
复制
SELECT keyword, 
       Count(*) 
FROM   topics_keywords 
       INNER JOIN keywords 
               ON topics_keywords.keyword_id = keywords.keyword_id 
       INNER JOIN (SELECT k1.keyword_id AS keyword_id, 
                          topics_keywords.topics_id 
                   FROM   keywords k1 
                          INNER JOIN topics_keywords 
                                  ON topics_keywords.keyword_id = k1.keyword_id 
                   WHERE  keyword = 'baseball') AS temp 
               ON temp.keyword_id != keywords.keyword_id 
                  AND temp.topics_id = topics_keywords.topics_id 
GROUP  BY keyword 

SQLFiddle演示

编辑:您也可以尝试这样做:

代码语言:javascript
复制
SELECT keywords.keyword, 
       Count(*) 
FROM   topics_keywords 
       INNER JOIN keywords 
               ON topics_keywords.keyword_id = keywords.keyword_id 
       INNER JOIN keywords k1 
               ON k1.keyword_id != keywords.keyword_id 
       INNER JOIN topics_keywords t1 
               ON t1.keyword_id = k1.keyword_id 
                  AND t1.topics_id = topics_keywords.topics_id 
WHERE  k1.keyword = 'baseball' 
GROUP  BY keyword 

SQLFiddle演示

我个人认为,第一个应该更快,但如果你可以基准它张贴的结果,这将是好的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12920406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档