我通过为我工作的大部分工作而构建的网络系统生成报告。基本上,网络系统跟踪我花费在计费工作上的每一个小时。它会生成CSV报告。
我将这些报告导入到我自己的本地mysql数据库中,以便我可以从中生成发票。当我发票时,我将两周的订单项(从报告中)放入发票中。然后我将相应的项目标记为已开具发票。
我的问题是:每次下载报告时,都会完整报告我的所有工作历史记录。在将csv导入我的mysql数据库之前,每次编辑csv并删除我对开发票不感兴趣的所有内容都很麻烦。特别是因为在很多情况下,我可以在几个月前为特定订单项开具发票。
我已经查看了mysql页面的UPDATE,REPLACE ...在DUPLICATE UPDATE等等。我的脑袋即将爆炸,我不明白我在读什么。
目标是:我希望今天能够导入报告,为一堆报告开具发票并将其标记为此类。然后,我希望能够下载一份新的报告,明天说它上面有新内容,并且只导入了新内容。不应导入旧数据,因为它: a)已存在于数据库中, b)可能已在数据库中明确修改,例如在其中一列中标记“已开票”等。
嗯...帮忙?EDIT:
Ok, so if my CSV contains the following:
7,8,9,
4,5,6,
1,2,3,
And I import that into my database, then my table contains:
7,8,9,
4,5,6,
1,2,3,
and I can make edits/changes etc to the database.
I generate a new report later and my csv looks like this:
16,17,18,
13,14,15,
10,11,12,
7,8,9,
4,5,6,
1,2,3,
Now, I want to bring only the changes into my DB, as in, I want to only:
16,17,18,
13,14,15,
10,11,12,
so that my db now looks like my csv:
16,17,18,
13,14,15,
10,11,12,
7,8,9,
4,5,6,
1,2,3,
But I don't want to edit/change/touch those last 3 lines, because I may have a good reason for editing them or adding new data into them in my db (after importing them from the csv of course).
EDIT2: 我通过翻转我的csv行的顺序让它工作。新行被添加到顶部,这意味着当我导入到我的表中时,最新行的id为1,这无助于下面的解决方案。
我正在使用的代码现在有效: 选择 * 来自lineitems_temp LEFT OUTER JOIN lineitems ON lineitems_temp.id = lineitems.id WHERE lineitems.id是NULL ORDER BY -lineitems_temp.id (这显示了行items_temp中的行项目,这是最新的报告,不在订单项上,这是旧报告。我认为也可以使用此机制查找已编辑的行等,按顺序帮助手动保持同步。)
答案 0 :(得分:2)
假设您要将结果加载到表“a”中 1.将新csv加载到临时表(b)中 2.在b和a上进行左外连接。 (当我们进行连接时,我们将获得a和b中的所有元素 当我们离开外连接时,我们将获得b中的元素,但不是a中的元素。这就是我们想要的。) 3.步骤2的结果,可以插入一个。使用相同的查询或临时表。