【问题标题】:Join two tables and display distinct list of column连接两个表并显示不同的列列表
【发布时间】:2013-08-29 09:09:55
【问题描述】:

我有三张桌子。

  1. 候选人

  1. 技能

  2. CandidateToSkillMap

CandidateSkill 表映射在 CandidateToSkillMap 表中。在那个candidate_id 和skill_id 是外键。

我怎样才能得到他们的以下输出?

假设我需要显示 Candidate_id = 1 的计算机技能

计算机技能 -

  • MS Word (x)
  • MS Excel (x)
  • MS 油漆 ()

它应该显示所有可用计算机技能的不同列表,并且前面应该有一个复选框。将检查特定候选人是否具有该技能。

编辑-

我有查询数据库并将数据加载到数组中 -

$candidate_profile_computer_skills

这个数组提供了所有的计算机技能

array (size=3)
  0 => 
    object(Candidate\Model\CandidateProfileSkill)[317]
      public 'id' => string '1' (length=1)
      public 'skill_name' => string 'MS Word' (length=7)
      public 'candidate_id' => null
      public 'candidateprofileskill_id' => null
  1 => 
    object(Candidate\Model\CandidateProfileSkill)[223]
      public 'id' => string '3' (length=1)
      public 'skill_name' => string 'MS Excel' (length=8)
      public 'candidate_id' => null
      public 'candidateprofileskill_id' => null
  2 => 
    object(Candidate\Model\CandidateProfileSkill)[316]
      public 'id' => string '6' (length=1)
      public 'skill_name' => string 'MS Paint' (length=8)
      public 'candidate_id' => null
      public 'candidateprofileskill_id' => null

$candidate_profile_skills_map

此数组返回 Skills 和 CandidateToSkillMap 以及特定候选人的 LEFT JOIN (candidate_id = 1)

array (size=5)
  0 => 
    object(Candidate\Model\CandidateProfileSkill)[321]
      public 'id' => string '1' (length=1)
      public 'skill_name' => string 'MS Word' (length=7)
      public 'candidate_id' => string '1' (length=1)
      public 'candidateprofileskill_id' => string '1' (length=1)
  1 => 
    object(Candidate\Model\CandidateProfileSkill)[322]
      public 'id' => string '2' (length=1)
      public 'skill_name' => string 'Sinhala Reading' (length=15)
      public 'candidate_id' => string '1' (length=1)
      public 'candidateprofileskill_id' => string '2' (length=1)
  2 => 
    object(Candidate\Model\CandidateProfileSkill)[323]
      public 'id' => string '3' (length=1)
      public 'skill_name' => string 'MS Excel' (length=8)
      public 'candidate_id' => string '1' (length=1)
      public 'candidateprofileskill_id' => string '3' (length=1)
  3 => 
    object(Candidate\Model\CandidateProfileSkill)[324]
      public 'id' => string '4' (length=1)
      public 'skill_name' => string 'English Reading' (length=15)
      public 'candidate_id' => string '1' (length=1)
      public 'candidateprofileskill_id' => string '4' (length=1)
  4 => 
    object(Candidate\Model\CandidateProfileSkill)[325]
      public 'id' => string '4' (length=1)
      public 'skill_name' => string 'English Reading' (length=15)
      public 'candidate_id' => string '1' (length=1)
      public 'candidateprofileskill_id' => string '4' (length=1)

【问题讨论】:

  • 向我们展示您目前编写的代码。

标签: php mysql database


【解决方案1】:

加入即可:

SELECT
    s.skill_name,
    CASE WHEN c.candidate_id IS NOT NULL THEN '(X)' ELSE '()' END has_skill
FROM
    skills s
    LEFT JOIN CandidateToSkillMap c ON s.skill_id = c.skill_id
WHERE
    c.candidate_id = 1

如果它成功加入右侧,因此c.candidate_id 将不为空,那么这意味着该人具有该技能并且您将其标记为其他 - 不要。

【讨论】:

    【解决方案2】:

    你可以用这个

    Select S.SkillName, count(*) from CandidateToSkillMap CTS, Skills S where S.Id = CTS.CandidateProfileSkillId group by CV.Id having CTS.CandidateId = 1

    【讨论】:

      【解决方案3】:
      SELECT * FROM [Skills] s
      LEFT JOIN [CandidateToSkillMap] csm ON csm.candidateprofileskill_id = s.id
      WHERE csm.candidate_id = 1
      

      这将返回技能表中的所有行,您可以对“candidate_id”列进行空值检查,以确定相关候选人是否具有该行的技能。

      这是一些伪代码:

      for($row in $result) { 
          Skill name: $row["skill_name"]
          Has skill?: $row["candidate_id"] != null ? "Yes" : "No"
      }
      

      【讨论】:

        【解决方案4】:

        你可以试试这个

        select S.skill_name from CandidateToSkillMap CSM, Skills s where  S.id=CSM.candidatesprofileskill_id and CSM.candidate_id=1
        

        【讨论】:

          【解决方案5】:

          试试类似的东西

          SELECT s.skill_name, (cm.Candidate_id IS NOT NULL) AS HasSkill
          
          FROM Skills AS s
          LEFT OUTER JOIN candidateToSkillMap AS cm
          ON s.id = cm.candidateprofileskill_id
          WHERE s.skill_type = 'Computer Literacy'
          AND (Candidate_id = 1 OR Candidate_id IS NULL)
          

          上述查询使用LEFT OUTER JOIN 连接skillscandidatestoskillmap 包括技能表中的所有行。这将确保 candidatestoskillmap 表中不匹配的所有行都作为空值包含在内。

          select 部分然后查找这些值并为其分配真/假。

          Where 部分过滤技能类型和候选人 ID。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-04
            • 2019-03-30
            • 2011-04-07
            相关资源
            最近更新 更多