Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ActiveRecord/SQL:复杂的数据库查询(外部加入/联合/?)_Sql_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

ActiveRecord/SQL:复杂的数据库查询(外部加入/联合/?)

ActiveRecord/SQL:复杂的数据库查询(外部加入/联合/?),sql,ruby-on-rails,ruby,activerecord,Sql,Ruby On Rails,Ruby,Activerecord,DB query:我想获得一个数据库查询,其中包含培训的所有参与者,显示所有参与者的姓名以及他们是否已经具备这一特定技能。要构建结果表,请参见示例,我希望循环查询结果,而不必为每个员工进行子查询 |participant name|has_this_one_specific_skill| |John Doe | yes | |Alex Hardacre | yes | |Abi Underw

DB query:我想获得一个数据库查询,其中包含培训的所有参与者,显示所有参与者的姓名以及他们是否已经具备这一特定技能。要构建结果表,请参见示例,我希望循环查询结果,而不必为每个员工进行子查询

|participant name|has_this_one_specific_skill|
|John Doe        |          yes              |
|Alex Hardacre   |          yes              |
|Abi Underwood   |          no               |
|Kevin Wallace   |          yes              |
|Connor Murray   |          no               |
这是我的数据库结构。这样的结构会是什么样子?这是左联还是我和工会一起去

注意:如果需要Employees对象,可以使用“选择”而不是“拾取”。ie.选择employees.name作为参与者名称,skills.id时使用CASE,然后选择“是”或“否”结束,因为这是一项特定技能

解决方案2


它将通过employees_skills表与skills表进行外部连接。但首先告诉我一件事,当你说‘他们是否已经有了某种技能’时,你的意思是你只想检查特定的单一技能吗?i-e招募所有员工,无论他们是否拥有MYSQL技能,技能中是否有MYSQL技能table@QaisarNadeem:正确。我只想检查一下具体的技能。员工可以拥有许多技能。我想说明的是,员工是否已经具备了在培训课程中“培训”的技能。您的参与课程看起来不太合适,我认为您的意思是:这是员工与培训之间的桥梁,对吗?如果是,那么它应该属于:员工&属于:培训???@Qaisarnadem:是的,当然。对不起,复制和过去时出错。将更新。好的,很好,我会为你写一个查询。只需确认您的数据库是什么,它是MYSQL还是POSTGRESQL?一个几乎即插即用的解决方案。对于pull,我得到了一个PG::DatatypeMismatch:ERROR:CASE/WHEN的参数必须是boolean类型,而不是bigint类型。必须更改为以下内容:。。。skills.id不为空时的情况。您想要ot更新吗?关于soltuion 1,它实际上只返回已经拥有该技能的员工,而不返回任何不具备该技能的员工。查看SQL ActiveRecord生成的:选择*从employees内部加入employees.id=参与者。employees\u id左外部加入employees\u skills ON employees\u skills.employees\u id=employees.id,其中参与者.training\u id=$1和1,4中的employees\u skills.skill\u id或employees\u skills\u id为空。您会注意到,它与解决方案2有点不同,后者提供了所需的结果!
class Employee < ApplicationRecord
  has_many :participants
  has_many :trainings,through: :participants
  has_many :trained_skills,through: :trainings,source: :skill
end



class Training < ApplicationRecord
  belongs_to :skill
end


class Participant < ApplicationRecord
  belongs_to :training
  belongs_to :employee
end
   Employee.left_joins(:trained_skills).where({skills: {name: ["MYSQL",nil]}}).pluck "employees.name,CASE WHEN skills.id IS NOT NULL THEN 'yes' else 'no' end"
 Employee.joins("LEFT OUTER JOIN participants
  ON participants.employee_id = employees.id LEFT OUTER JOIN trainings
  ON trainings.id = participants.training_id LEFT OUTER JOIN skills
  ON skills.id = trainings.skill_id AND skills.name = 'MYSQL'").
  pluck "employees.name,CASE WHEN skills.id IS NOT NULL THEN 'yes' else 'no' end"