2017-09-26 10 views
0

私はほとんどの時間、ORMツールを使用してきました。私はいくつかのSQLを実行する必要があります - 私の典型的なRails環境ではありません。結果のSQLサブセット

"SELECT projects.id, projects.company_id, projects.name, 
    companies.name as company_name, 
    people.name as person_name, 
    users.name as user_name 
    FROM projects 
    INNER JOIN companies ON companies.id = projects.company_id 
    LEFT OUTER JOIN project_people ON project_people.project_id = projects.id 
    LEFT OUTER JOIN people ON people.id = project_people.person_id 
    LEFT OUTER JOIN project_users ON project_users.project_id = projects.id 
    LEFT OUTER JOIN users ON users.id = project_users.user_id" 

1つのレコードを選択すると、通常、結果に複数の行が表示されます。私は2人のproject_peopleと2人のproject_usersを持っています。

私が取得します:

{"id"=>"7744", "company_id"=>"42598", "name"=>"Project with a name", "company_name"=>"(Confidential)", "person_name"=>"A person name", "user_name"=>nil} 
    {"id"=>"7744", "company_id"=>"42598", "name"=>"Project with a name", "company_name"=>"(Confidential)", "person_name"=>"Another name", "user_name"=>nil} 
    {"id"=>"7744", "company_id"=>"42598", "name"=>"Project with a name", "company_name"=>"(Confidential)", "person_name"=>"Another name", "user_name"=>'Some user'} 
    {"id"=>"7744", "company_id"=>"42598", "name"=>"Project with a name", "company_name"=>"(Confidential)", "person_name"=>"A person name", "user_name"=>'Some user'} 

私が持っていると思い何は以下の通りです:

{"id"=>"7744", "company_id"=>"42598", "name"=>"Project with a name", "company_name"=>"(Confidential)", "people"=>{ 
       "person_name"=>"A person name", 
       "person_name"=>"Another name", 
     }, "users"=>{ 
       "user_name"=>nil, 
       "user_name"=>'Some user' 
     } 
    } 

私はあなたがこれを簡単に解決することができるSQLであなたの第一人者年代のいくつかのために知っています私がこのような不満な質問をするのは、どうしてひどいことだと思うのが恐ろしいのです。私はこれが可能であると確信しています - 単一のクエリで

答えて

0

私はpostgresでこのarray_aggを見つけました - 私が必要とするようです!

"SELECT projects.id, projects.company_id, projects.name, 
    companies.name AS company_name, 
    array_agg(people.name) AS people, 
    array_agg(users.name) AS users 
    FROM projects 
    INNER JOIN companies ON companies.id = projects.company_id 
    LEFT OUTER JOIN project_people ON project_people.project_id = projects.id 
    LEFT OUTER JOIN people ON people.id = project_people.person_id 
    LEFT OUTER JOIN project_users ON project_users.project_id = projects.id 
    LEFT OUTER JOIN users ON users.id = project_users.user_id 
    GROUP BY projects.id" 

私はまた、この削除重複が;-)た - 私はこれがどのように実行するかどのようにいけないが、それは仕事をよく行い

array_agg(DISTINCT CONCAT(people.id, ' ', people.name)) AS people 
    array_agg(DISTINCT CONCAT(users.id, ' ', users.name)) AS users