2

必要なデータをクエリするための良い方法を見つけるのに苦労しています。私はmySQLとphpを使用しています。現在、複数のクエリを実行し、ループごとに多数のforを使用していますが、それでも必要な出力を取得できません。

これは難しい質問かもしれませんので、それを理解するために何らかの努力をしてくれた人に感謝します!


私の現在のテーブルは次のとおりです。

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ごとに1つのキーワードのみが定義されます。

誰かが特定のキーワード(つまりスポーツ)を照会した場合、topic_idに関連するすべての関連キーワードのリストを返したいと思います。

以下のSQLでは、トピック3がkeyword_idの3(スポーツ)および4(野球)に関連付けられていることがわかります。ただし、keyword_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);

どうもありがとう!

4

1 に答える 1

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デモ

編集:これも試すことができます:

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デモ

個人的には、最初の方が速いはずだと思いますが、ベンチマークができれば、良い結果を投稿できます。

于 2012-10-16T17:55:47.127 に答える