如何在SQL表

时间:2017-11-10 16:23:43

标签: 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 | 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会是什么样子?谢谢!

3 个答案:

答案 0 :(得分:1)

您必须将关联公司及其部门存储在数据库的每一行中。因为没有隐含的" order"对于数据库中的行,没有办法让一行将其公司视为与行#34;之前的#34; ("之前"没有任何意义。)

在查询结果集的行上清空冗余公司名称并不值得。只要让它们出现在每一行,即使它看起来多余。

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

query 'SELECT Company, Department FROM MyTable ORDER BY Company, Department'

prev_company = ''

while row = fetch
do
    if row.company == prev_company
        display ''
    else
        display row.company
        prev_company = row.company

    display row.department
done

答案 1 :(得分:0)

虽然比尔的解决方案肯定会有效,但我的偏见是在你所描述的一对多关系中创建单独的数据库实体(以及扩展的单独表格)。

因此,我将创建一个company表和一个department表,并通过外键department列在company表中包含company_id个引用行

TABLE: company
id
name

TABLE: department
id
company_id
name

然后,您可以选择所有部门记录,加入公司表,然后按company_id排序......然后您可以将查询结果后处理为您需要的任何数据结构。

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

您不会复制数据。如果公司名称发生变化,您只需更新一条记录,而不是更新与该公司相关的所有记录。 2)它更灵活。如果你以后

答案 2 :(得分:-1)

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

SELECT organisation, department FROM table GROUP BY organisation;

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

即可