MySQL查询 - 如何获取相关标签的数量

时间:2012-10-16 17:39:24

标签: php mysql

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

这可能是一个棘手的问题,所以我感谢任何努力想出来的人!


我目前的表格如下:

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与keyword_id 3(体育)和4(棒球)相关联。但请注意,它还与keyword_id 2(hello)相关联。

我只需要计算多少次' sports'与棒球有关。我只是说,但我无法找到一种简单的方法。

根据以下数据,最终输出需要看起来像这样:

搜索词:'棒球' 最终输出:

count  | keyword
----------------
sports | 2
hello  | 1

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

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

非常感谢!

1 个答案:

答案 0 :(得分:3)

试试这个:

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 DEMO

编辑:你也可以试试这个:

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 DEMO

我个人认为第一个应该更快,但是如果你可以对它进行基准测试,那么结果会很好。