2016-04-15 17 views
3

私は3つのテーブルを持つMySQL DBを持っています。MySQLと1対多のリレーションシップ(共有値付き)

プロファイル、 p_tags、 タグ

DB:

profile 
pid | name 

ptags 
ptid | pid | tagid 

tags 
tagid | tag 

DBは、私は必要なものこの

profile 
pid | name 
1 Randy 
2 Jeff 
3 Mike 

ptags 
ptid | pid | tagid 
1  1  1 
2  1  2 
3  2  1 
4  2  3 
5  3  1 
6  3  2 
7  3  3 

tags 
tagid | tag 
    1  science 
    2  filosophy 
    3  hydrology 

ようになりますに名前を表示するクエリを作成することです共有タグを持つプロファイルと合計共有タグ

I.E.

Results 
Name | Name2 | Count 
Randy - Jeff - 1 
Randy - Mike - 2 
Jeff - Randy - 1 
Jeff - Mike - 2 
Mike - Randy - 2 
Mike - Jeff - 2 

など。

私は正しく説明してもわかりません。

私はこの1つのように別のポストからのリンクから

https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/

を読んで、ちょうどそれのまわりで私の頭を取得することはできません:)。

SQLFiddle:クエリの使用中http://sqlfiddle.com/#!9/42bde6

+2

を私は何のために推薦しますいくつかのダミーデータを持つ[SqlFiddle](http://sqlfiddle.com)のようなものをセットアップするためにMySQLが関与しているので、自分で行う必要はありません。既に設定したものに加えてリンクを含めると、回答が得られる可能性が高くなります。 – Jhecht

+0

はあなたのサイトphptherightway ... [PDO Extension](http://www.phptherightway.com/#pdo_extension)、[MySQL Extension](http://www.phptherightway.com/#mysql_extension) –

+0

ありがとうございますあなたの提案については、今後の質問でそれらを実装します。実際には、私はちょうどこれについて1つ(私は思います)でした。 – user3701157

答えて

2

が参加:

SELECT p1.name Name1, p2.name Name2, Count(tagid) 
FROM ptags AS t1 
INNER JOIN ptags AS t2 ON t2.tagid = t1.tagid and t2.ptid <> t1.ptid 
INNER JOIN profile AS p1 ON p1.pid = t1.pid 
INNER JOIN profile AS p2 ON p2.pid = t2.pid 
GROUP BY p1.name, p2.name 

、あなたはFIRSTNAMEのペアに対してのみ1行が必要な場合は、この試してみてください。

SELECT p1.firstname Name1, p2.firstname Name2, Count(t1.tagid) 
FROM profile_hashtags AS t1 
INNER JOIN profile_hashtags AS t2 
    ON t2.tagid = t1.tagid and t2.pHid > t1.pHid 
INNER JOIN `profile` AS p1 ON p1.pid = t1.pid 
INNER JOIN `profile` AS p2 ON p2.pid = t2.pid 
GROUP BY p1.firstname, p2.firstname; 
+0

このアダムに感謝します。私がこのクエリで抱えている問題は、最初の2つしか返ってこないということです。上記の提案によれば、私はsqlfiddleを追加しました。 http://sqlfiddle.com/#!9/9e618 – user3701157

+0

変更されたコードにはフィドルのDBと連携しては、次のとおりです。SELECT p1.firstname名1、p2.firstname Name2は、カウント(t1.tagid) \t \t \t \t \t \t T1 AS profile_hashtags FROM \t \t \t \t \t \t \t t2.tagid = t1.tagidとt2.pHid <> t1.pHid ON T2と\t \t \t \t \t内部結合profile_hashtags \t \t \t \t \t \t \t \t \t INNER JOINプロファイルAS p1 ON p1.pid = t1。PHID \t \t \t \t \t \t \t \t \t INNERはp1.firstname、[OK]をp2.firstname – user3701157

+0

が、あなたが唯一の変更、GROUP BY p2.pid = t2.pHid \t \t \t \t \t \t \t \t \t ON P2とプロフィールをチェックしましょうテーブルとフィールドの名前...別の結果が期待されますか? –

関連する問題