Mysql 如何分离SQL表中的数据

Mysql 如何分离SQL表中的数据,mysql,sql,database,csv,web-applications,Mysql,Sql,Database,Csv,Web Applications,我有一个带有数据记录的.csv文件,每行包含组织的部门。我想将它们导入MySQL数据库,并在web应用程序中显示它们。数据记录的样本摘要如下所示: | Company A | Department aaa | | Company A | Department bbb | | Company A | Department ccc | | Company B | Department ddd | | Company B | Department eee | | Company C | Departm

我有一个带有数据记录的.csv文件,每行包含组织的部门。我想将它们导入MySQL数据库,并在web应用程序中显示它们。数据记录的样本摘要如下所示:

| Company A | Department aaa |
| Company A | Department bbb |
| Company A | Department ccc |
| Company B | Department ddd |
| Company B | Department eee |
| Company C | Department fff |
| Company C | Department ggg |
| Company C | Department hhh |
| Company D | Department iii |
| Company E | Department jjj |
| Company E | Department kkk |
当然,我想向每个公司展示一次,每个公司都有相关的部门,这或多或少让它看起来是这样的:

| Company A | Department aaa |
|           | Department bbb |
|           | Department ccc |
| Company B | Department ddd |
|           | Department eee |
| Company C | Department fff |
|           | Department ggg |
|           | Department hhh |
| Company D | Department iii |
| Company E | Department jjj |
|           | Department kkk |

我的问题是,连接这些数据记录的最佳方式是什么?您是使用适当的编程语言(如PHP、Ruby、Perl等)还是使用SQL查询在数据库中执行此操作?如果选择SQL,您会使用存储过程、临时表,甚至是在导入接口上这样做吗?如果是SQL,它会是什么样子?谢谢大家!

我会在SQL中执行此操作,它似乎是一个常规的按类型分组查询,因此当数据库可以为您执行此操作时,我认为没有必要在服务器代码中跳转。如果愿意,可以运行原始查询或使用ORM。无论哪种方式,SQL都应该类似于:

从表中按组织分组选择组织、部门


除非所有部门名称都是唯一的,否则您可以选择所有内容并按组织名称排序

我将在SQL中执行此操作,它似乎是一个常规的按类型分组查询,因此当数据库可以为您执行此操作时,我认为不需要在服务器代码中跳转。如果愿意,可以运行原始查询或使用ORM。无论哪种方式,SQL都应该类似于:

从表中按组织分组选择组织、部门


除非所有部门名称都是唯一的,否则您只需选择所有内容并按组织名称排序

您必须在数据库中的每一行存储与其部门关联的公司。由于数据库中没有对行的隐式“订单”这样的东西,因此行无法将其公司视为与行“before”上的公司相同(对“before”没有任何意义)

在查询结果集中的行中,不值得费心地将多余的公司名称留空。只要让它们出现在每一行,即使它看起来是多余的

然后在应用程序中,当您呈现数据时,您确实有机会在显示数据时按顺序处理它们。所以您可以这样做(伪代码):


您必须在数据库的每一行上存储与其部门关联的公司。由于数据库中没有对行的隐式“订单”这样的东西,因此行无法将其公司视为与行“before”上的公司相同(对“before”没有任何意义)

在查询结果集中的行中,不值得费心地将多余的公司名称留空。只要让它们出现在每一行,即使它看起来是多余的

然后在应用程序中,当您呈现数据时,您确实有机会在显示数据时按顺序处理它们。所以您可以这样做(伪代码):


虽然Bill的解决方案肯定会起作用,但我的偏好是,只要存在您所描述的一对多关系,就可以创建单独的数据库实体(并扩展为单独的表)

因此,我将创建一个
company
表和一个
department
表,并通过外键
company\u id
列在
company
表中引用
department

TABLE: company
id
name

TABLE: department
id
company_id
name
然后,您可以选择所有部门记录,根据公司表进行联接,并按公司id进行订购。。。然后,您可以将查询结果后处理为所需的任何数据结构

与将数据集中到单个表中相比,我更喜欢联接有很多原因;它感觉更灵活,它模仿了一个由相互关联的模型组成的树结构。但最大的原因是:

您没有复制数据。如果公司名称更改,您只需更新一条记录,而不必更新与该公司相关的所有记录。
2) 它更灵活。如果您稍后

尽管Bill的解决方案肯定会奏效,但我的偏好是,只要存在您所描述的一对多关系,就可以创建单独的数据库实体(并扩展为单独的表)

因此,我将创建一个
company
表和一个
department
表,并通过外键
company\u id
列在
company
表中引用
department

TABLE: company
id
name

TABLE: department
id
company_id
name
然后,您可以选择所有部门记录,根据公司表进行联接,并按公司id进行订购。。。然后,您可以将查询结果后处理为所需的任何数据结构

与将数据集中到单个表中相比,我更喜欢联接有很多原因;它感觉更灵活,它模仿了一个由相互关联的模型组成的树结构。但最大的原因是:

您没有复制数据。如果公司名称更改,您只需更新一条记录,而不必更新与该公司相关的所有记录。
2) 它更灵活。如果您稍后询问如何将该文件导入现有数据库/应用程序,或者这是一个围绕尚未设计的CSV文件讨论解决方案设计的问题?如果是后者,那么IMHO这不是SO的问题。MySQL不支持CTE(
和RECURSIVE
子句),这将使此查询相对简单。例如,PostgreSQL和SQLite3有以下解决方案:@tonypdmtr、MySQL 8.0.1和更高版本支持递归CTE,这是值得的。但8.0目前仍处于发行候选状态。您是在询问如何将该文件导入现有数据库/应用程序,还是在讨论围绕尚未设计的CSV文件设计解决方案的问题?如果是后者,那么IMHO这不是SO的问题。MySQL不支持CTE(
和RECURSIVE
子句),这将使此查询相对简单。PostgreSQL和SQLite3,用于e