Php MySQL一对多关系,具有共享值

Php MySQL一对多关系,具有共享值,php,mysql,Php,Mysql,我有一个MySQL数据库,有3个表 个人资料, p_标签, 标签 DB: 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 ta

我有一个MySQL数据库,有3个表

个人资料, p_标签, 标签

DB:

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
我需要的是创建一个查询,显示配置文件中具有共享标记的名称和总共享标记

等等

我不知道我是否解释正确

我读

来自另一篇类似于本文的文章的链接,但我无法理解:)

SQLFIDLE:

在查询中使用联接:

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

我建议任何涉及MySQL的东西都使用一些虚拟数据来设置类似于a的东西,这样我们就不必自己做了。如果您在已设置的内容之外还包含一个链接,则更有可能获得答案。为您推荐网站phptherightway,谢谢你们两位的建议,我将在以后的问题中实施它们。事实上,我只是为这个做了一个(我想),谢谢你,亚当。这个查询的问题是它只返回前2个。根据上面的建议,我添加了一个SQLFIDLE。修改后的代码可以与fiddle db一起使用:选择p1.firstname Name1、p2.firstname Name2、Count(t1.tagid)从配置文件\u hashtags AS t1 internal JOIN profile\u hashtags AS t2 ON t2.tagid=t1.tagid和t2.pHid t1.pHid internal JOIN profile AS p1 ON p1.pid=t1.pHid internal JOIN profile AS p2.pid=t2.pHid GROUP BY p1.firstname,p2.firstname确定,但您只更改表和字段的名称。。。你期待不同的结果吗?不,亚当,我只是按照建议做的,我并不期待不同的结果,当我写这篇文章的时候,我正在阅读其他的选择。就像我之前发布的,我是MySQL关系的完全初学者。我刚刚发布了一个更新,我正试着自己去弄清楚。我阅读了您的查询,花了我几分钟的时间才理解您获得这些结果的方法:)。我会继续读下去。再次感谢你,亚当,我真的很感谢所有关于这个问题的帮助和评论。我意识到我有很多关于连接和MySQL的阅读要做:)。
Results
Name  | Name2 | Count
Randy - Jeff - 1
Randy - Mike - 2
Jeff - Randy - 1
Jeff - Mike - 2 
Mike - Randy - 2
Mike - Jeff - 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
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;