2016-12-25 15 views
1

私は記事付きのデータベースを持っています。すべての記事にキーワードがあります。キーワードは、別のテーブルにあり、キーワードと記事はthusly、リレーショナルテーブルに接続されている:MySQLの外部キーの選択は一致します

記事

CREATE TABLE `articles` (
    `id` int(11) NOT NULL, 
    `articleTitle` varchar(50) NOT NULL, 
    `articleBody` text NOT NULL, 
    `articlePermalink` varchar(50) NOT NULL, 
    `articleAuthor` int(11) NOT NULL, 
    `createdAt` datetime DEFAULT CURRENT_TIMESTAMP, 
    `updatedAt` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

キーワード

CREATE TABLE `keywords` (
    `id` int(11) NOT NULL, 
    `keyword` varchar(64) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

articlekeywords

CREATE TABLE `articlekeywords` (
    `id` int(11) NOT NULL, 
    `articleId` int(11) NOT NULL, 
    `keywordId` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

articles.idを識別子として使用して、特定の記事と共通のキーワードの一部またはすべてを持つすべての記事を選択したいとします。好ましくは、単一のSQL呼び出しで行う。

EDIT:

私は何Gordon Linoff suggested belowと非常によく似た何かをやってしまいました。

SELECT DISTINCT a.articleTitle, a.articlePermalink 
FROM articles a 
JOIN articlekeywords ak ON a.id = ak.articleId 
JOIN articlekeywords ak2 ON ak.keywordId = ak2.keywordId AND ak2.articleId = $articleId AND not(a.id = $articleId) 

答えて

1

これは自己結合です。あなたは行って、共通するキーワードの数が注文したマッチングの記事を取得することができます:

select ak2.article2, count(*) as numKeywordsInCommon 
from articlekeywords ak join 
    articlekeywords ak2 
    on ak.keywordid = ak2.keywordid and ak2.articleid = $arcticleid 
group by ak2.articleid 
order by numKeywordsInCommon desc; 
+0

私はある必要があると思いますOPが一致するキーワードを要求したときに、自分自身と行を結合するのを避けるためには、結合のidの不等式である必要があります。 – GurV

+0

ええと、私はこれが私の必要としていることを確信していません。どのキーワードがどれくらい一致するかはわかりますが、一致する記事はありません。使用例:記事#1にはキーワードがあり、記事#2にもキーワードがあります。記事#nのマッチを検索すると、記事#1と#2を表示する必要があります。私がOPに書いたように、私は記事を選択する必要があります、一致するキーワードではありません。 –

+0

私はこの答えを受け入れるつもりです。なぜなら私は元の質問で更新する非常に似たようなことをやってしまったからです。ありがとう、@ Gordon Linoff –

1

これはあなたにarticlekeywordsテーブル内の関係で識別される完全なリストを提供します:

SELECT * FROM articlekeywords AKW 
JOIN articles A ON AKW.articleId = A.Id 
JOIN keywords K ON AKW.keywordId = K.Id 
-- WHERE (some condition you'd like to do for further filtering) 
+0

質問を読んだ後は、共通のキーワードを持つ記事だけを識別しようとしている場合、@ GordonLinoffが推奨するものに近いものを実行したいことがあります。 –

+0

ええ、私は同じことを考えていたが、とにかくあなたに感謝:) –

関連する問題