Php MySQL查询-如何获得相关标记的数量计数
我正在努力寻找一种查询所需数据的好方法。我正在使用mySQL和php。目前,我正在进行多个查询并使用一组for-each循环,但是,我仍然无法获得必要的输出 这可能是一个很难回答的问题,所以我很感激任何一个付出努力来解决这个问题的人Php MySQL查询-如何获得相关标记的数量计数,php,mysql,Php,Mysql,我正在努力寻找一种查询所需数据的好方法。我正在使用mySQL和php。目前,我正在进行多个查询并使用一组for-each循环,但是,我仍然无法获得必要的输出 这可能是一个很难回答的问题,所以我很感激任何一个付出努力来解决这个问题的人 我目前的表格如下: topics_keywords (t_k_id, topic_id, keyword_id) keywords (keyword_id, keyword) topics (topic_id, subject, etc) 表topics\u k
我目前的表格如下:
topics_keywords (t_k_id, topic_id, keyword_id)
keywords (keyword_id, keyword)
topics (topic_id, subject, etc)
表topics\u keyword
将有多个关键字与同一主题id关联
表关键字
将仅为每个关键字id定义一个关键字
如果有人查询特定的关键字(即体育),我想返回与主题id相关的所有相关关键字的列表
在下面的SQL中,您将看到主题3与关键字_id的3(运动)和4(棒球)相关联。但是,请注意,它还与关键字_id 2(hello)关联
我只需要计算一下“运动”与棒球的联系有多少次。我说得很简单,但我想不出一个简单的方法来做
基于以下数据的最终输出需要如下所示:
搜索词:“棒球”
最终输出:
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);
非常感谢 试试这个:
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
编辑:您也可以尝试以下操作:
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
我个人认为第一个应该更快,但如果你能对其进行基准测试,发布结果会更好。首先,这是一个非常令人困惑的问题,因为数据关系存在一定的困惑,特别是在应用示例后。运动计数应该是
3
,因为主题:3,5,6
是的,它假设它应该是3,尽管在我的测试中,我排除了返回相同结果。因此,如果体育运动与任何其他事物无关,它只是在某个特定的主题中单独出现,它将被忽略。哦,哇,这正是我所寻找的…和我已经拥有的代码的五分之一。。只有一个查询!非常好。第二个查询比第一个查询慢了100%(0.0012秒)。但是,我现在没有太多的数据要查看。grt感谢您发布结果:)这就是我的想法:)