2017-09-26 28 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" 

如果我選擇單個記錄,我通常會在結果中獲得多行,例如如果我有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