繁体   English   中英

MySQL多对多选择

[英]MySQL Many to Many select

我正在尝试创建一个MySQL多对多选择查询。 我有三张桌子:

  • 简介
  • 技能
  • Profile_skills(个人资料ID和技能ID)

我希望能够搜索技能(例如PHP),并且所有具有该技能的配置文件都会显示在列表中,但包括所有其他技能。 像大多数自由职业网站一样,所以我也可以看到他们知道MySQL等。

我没有找到或想出正确的方法来获取有关个人资料的所有信息,包括他们的所有技能。 到目前为止,这是我最好的结果:

SELECT * FROM profiles INNER JOIN profile_skills ON 
profile_skills.profil_id = profiles.profil_id INNER JOIN skills ON
skills.skill_id = profile_skills.skill_id WHERE skill = 'PHP'

但这只能给我一个技能而不是其他技能。

结果: http//imgur.com/E9PEiaU

预期:拥有id,技能“PHP”和其他技能,例如“C#”,如果用户ID 1拥有该技能。 http://imgur.com/5bCG4qo

所以当我搜索具有技能的配置文件时,它也会显示其余的配置文件获取的技能。

您可能希望子查询识别帐户,然后使用超级查询加载有关它们的详细信息(如果需要,还可以使用GROUP_CONCAT技能)。 就像是:

SELECT profiles.*, GROUP_CONCAT(skills.skill SEPARATOR ', ') AS the_skillz
FROM profiles INNER JOIN profile_skills (...) INNER JOIN skills (...)
WHERE profiles.profile_id IN (
  SELECT DISTINCT profile_id 
  FROM profile_skills INNER JOIN skills (...) 
  WHERE skills.skill = 'PHP'
)
GROUP BY profiles.profile_id;

您可以重新加入profile_skillsskills表以获得所需的结果。

SELECT p.*, s2.*
FROM skills s1
INNER JOIN profile_skills ps1 ON s.skill_id = ps1.skill_id
INNER JOIN profiles p ON ps1.profil_id = p.profil_id
INNER JOIN profile_skills ps2 ON p.profil_id = ps2.profil_id
INNER JOIN skills s2 ON ps2.skill_id = s2.skill_id
WHERE s1.skill = 'PHP'

这会得到这样的结果:

| p.id | p.name | s.id |       s.skill      |
---------------------------------------------
|  1   | rasmus |  1   |         PHP        |
|  1   | rasmus |  2   |        Linux       |
|  2   | thomas |  1   |         PHP        |
|  2   | thomas |  3   |  Eating Sandwiches |

有各种不同的方法可以使用一系列技能将每个配置文件放在一行中。 一种方法是使用MySQL中的GROUP_CONCAT

SELECT p.profil_id, p.profile_name, GROUP_CONCAT(s2.skill) AS skills
FROM skills s1
INNER JOIN profile_skills ps1 ON s.skill_id = ps1.skill_id
INNER JOIN profiles p ON ps1.profil_id = p.profil_id
INNER JOIN profile_skills ps2 ON p.profil_id = ps2.profil_id
INNER JOIN skills s2 ON ps2.skill_id = s2.skill_id
WHERE s1.skill = 'PHP'
GROUP BY p.profil_id

我添加了profile_name列,例如,因为我不知道你的列实际是什么,你可以添加其他列,甚至仍然使用p.* 从技术上讲,在其他列profile不与定义的GROUP BY p.profil_id ,你一般不宜选择也没有被包括在分组或某些聚合函数列,但MySQL将照顾为你这种情况 ,因为它们对于具有相同p.profil_id每一行都具有相同的p.profil_id

另一种方法是只使用第一个查询并在PHP中进行分组:

$previous_id = null;
while ($row = some_fetch_method()) {
    if ($row['profil_id'] != $previous_id) {
        echo "<h3>$row[profile_name]</h3>";
    }
    echo "<div>$row[skill]</div>";
}

很明显,HTML并不是你所需要的,但它应该足以显示出一般的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM