我有一个包含数据记录的.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会是什么样子?谢谢!
答案 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;
除非所有部门名称都是唯一的,否则您只需选择所有内容并按组织名称排序
即可