Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL查询-如何获得相关标记的数量计数_Php_Mysql - Fatal编程技术网

Php MySQL查询-如何获得相关标记的数量计数

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

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

这可能是一个很难回答的问题,所以我很感激任何一个付出努力来解决这个问题的人


我目前的表格如下:

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感谢您发布结果:)这就是我的想法:)