Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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
Sql Ruby:返回按多列分组的数据_Sql_Ruby On Rails_Ruby_Hashmap_Hashtable - Fatal编程技术网

Sql Ruby:返回按多列分组的数据

Sql Ruby:返回按多列分组的数据,sql,ruby-on-rails,ruby,hashmap,hashtable,Sql,Ruby On Rails,Ruby,Hashmap,Hashtable,我正在尝试web服务的组数据 web服务在RubyonRails上运行,我在我的API控制器中工作(让我们称之为我的项目的索引操作) 表架构如下所示(由于NDA原因,数据类型和示例已更改)。不幸的是,这里的示例建议我将员工和项目分为不同的表,但请暂时忽略这一点。我收到的数据如下: COLUMNS: employee, e_id, company, hire_date, project_name, project_due_date ROWS: John, 12345, XYZ, 01-01-20

我正在尝试web服务的组数据

web服务在RubyonRails上运行,我在我的API控制器中工作(让我们称之为我的项目的索引操作)

表架构如下所示(由于NDA原因,数据类型和示例已更改)。不幸的是,这里的示例建议我将员工和项目分为不同的表,但请暂时忽略这一点。我收到的数据如下:

COLUMNS:
employee, e_id, company, hire_date, project_name, project_due_date

ROWS:
John, 12345, XYZ, 01-01-2001, Project_A, 12-31-2012
John, 12345, XYZ, 01-01-2001, Project_B, 03-15-2013
John, 12345, XYZ, 01-01-2001, Project_C, 06-25-2013
Jane, 98765, XYZ, 05-22-2003, Project_Q, 01-15-2013
Jane, 98765, XYZ, 05-22-2003, Project_W, 02-25-2013
Jane, 98765, XYZ, 05-22-2003, Project_E, 08-01-2013
为了减少数据传输,我想返回上述内容,如下所示:

[
    {
        "employee":"John",
        "e_id":"12345",
        "company":"XYZ",
        "hire_date":"01-01-2001",
        "projects":[
                     { "project_name":"Project_A", "project_due_date":"12-31-2012" },
                     { "project_name":"Project_B", "project_due_date":"03-15-2013" },
                     { "project_name":"Project_C", "project_due_date":"06-25-2013" }
                   ]
    },
    {
        "employee":"Jane",
        "e_id":"98765",
        "company":"XYZ",
        "hire_date":"05-22-2003",
        "projects":[
                     { "project_name":"Project_Q", "project_due_date":"01-15-2013" },
                     { "project_name":"Project_W", "project_due_date":"02-25-2013" },
                     { "project_name":"Project_E", "project_due_date":"08-01-2013" }
                   ]
    }
]
def index
   sql = "SELECT employee, e_id, company, hire_date, project_name, project_due_date
     FROM projects
     AND created_at = (SELECT created_at FROM projects ORDER BY created_at DESC LIMIT 1)
     ORDER BY company, employee, project_due_date"

   result = Project.find_by_sql(sql)
   respond_with(result)
end
我似乎无法找到将我的SQL查询结果(行)分组到理想数据中的有序散列中的最佳方法。我想我需要一些。每个和散列都可以对SQL调用返回的数据进行后处理,但我似乎无法找到“Ruby”方法(我也不是一个经验丰富的Ruby开发人员,所以如果有任何参考链接,我也会非常感激,这样我就可以阅读解决方案了)

我怎样才能做到这一点

[编辑]

我正在对项目对象执行SQL查询。我的控制器如下所示:

[
    {
        "employee":"John",
        "e_id":"12345",
        "company":"XYZ",
        "hire_date":"01-01-2001",
        "projects":[
                     { "project_name":"Project_A", "project_due_date":"12-31-2012" },
                     { "project_name":"Project_B", "project_due_date":"03-15-2013" },
                     { "project_name":"Project_C", "project_due_date":"06-25-2013" }
                   ]
    },
    {
        "employee":"Jane",
        "e_id":"98765",
        "company":"XYZ",
        "hire_date":"05-22-2003",
        "projects":[
                     { "project_name":"Project_Q", "project_due_date":"01-15-2013" },
                     { "project_name":"Project_W", "project_due_date":"02-25-2013" },
                     { "project_name":"Project_E", "project_due_date":"08-01-2013" }
                   ]
    }
]
def index
   sql = "SELECT employee, e_id, company, hire_date, project_name, project_due_date
     FROM projects
     AND created_at = (SELECT created_at FROM projects ORDER BY created_at DESC LIMIT 1)
     ORDER BY company, employee, project_due_date"

   result = Project.find_by_sql(sql)
   respond_with(result)
end
我得到的数据是以下格式的一组项目对象

RUBY调试器:

(rdb:2) result
[#<Project employee: "John", e_id: 12345, company: "XYZ", hire_date: "01-01-2001", project_name: "Project_A", project_due_date: "12-31-2012">,
 #<Project employee: "John", e_id: 12345, company: "XYZ", hire_date: "01-01-2001", project_name: "Project_B", project_due_date: "03-15-2013">,
 #<Project employee: "John", e_id: 12345, company: "XYZ", hire_date: "01-01-2001", project_name: "Project_C", project_due_date: "06-25-2013">,
 #<Project employee: "Jane", e_id: 98765, company: "XYZ", hire_date: "05-22-2003", project_name: "Project_Q", project_due_date: "01-15-2013">,
 #<Project employee: "Jane", e_id: 98765, company: "XYZ", hire_date: "05-22-2003", project_name: "Project_W", project_due_date: "02-25-2013">,
 #<Project employee: "Jane", e_id: 98765, company: "XYZ", hire_date: "05-22-2003", project_name: "Project_E", project_due_date: "08-01-2013">]
(rdb:2)结果
[#,
#,
#,
#,
#,
#]
[编辑2]

我知道我可以用一种非常简单的、非Ruby的方式来解决这个问题,但我想知道让它工作的正确方法。基本的解决方案可以包括迭代结果数组并逐行解析数据,将员工数据保存到临时哈希,将他们的项目数据保存到哈希数组w employee,将前一个员工数据的数据保存在一个数组中,并为下一个员工重置临时数组/哈希。非常难看,但很有可能


但是,必须有Ruby方式。请帮助!

以请求的形式生成分组数据:

grouped_data = data.group_by do |project|
  [project.employee, project.e_id, project.company, project.hire_date]
end.map do |k, v|
  { 
    "employee"  => k[0],
    "e_id"      => k[1],
    "company"   => k[2],
    "hire_date" => k[3],

    "projects" => v.map do |p|
      {
        "project_name"     => p.project_name,
        "project_due_date" => p.project_due_date
      }
    end
  }
end
最后使用
生成json格式的版本,例如:

grouped_data.to_json

SQL结果是单一文本吗?您拥有的Ruby对象到底是什么?您使用的是Rails还是其他框架?哪个数据库?任何ORM,或者您想要一个简单SQL查询的解决方案?到目前为止您尝试了什么?@sawa I在原始帖子的底部添加了一个部分“”更多信息。希望这能澄清一点。@padde web服务API是使用Ruby on Rails编写的。DB是SQLITE3。请参阅原始帖子中的my。希望这能更好地描述我的问题。我不完全确定这方面的最佳解决方案是什么(事实上,我现在完全被卡住了)。如果这是用纯SQL解决的,那就好了。我更喜欢提供最快响应时间的解决方案,因为这是一个将从手机调用的API。谢谢!谢谢你的回复,但是结果并不完全是我想要的。请在我的原始帖子的第二个代码块中看到预期的JSON结果。OK-我已经更新了答案,以在要求的表格中生成结果。工作完全按照预期进行,我实际上学到了一些东西,以备下次使用。非常感谢。