所有关于电路

MySQL在3个表之间的比较

zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
你好。我在开发程序在python和需要做一些复杂的MYSQL查询涉及3表。

TABLE1 -由“配方”数据组成。它描述了我们需要的序列号和数量

TABLE2 -想象这是人1。这个人有一些给他自己的序列号。

TABLE3 -想象这是人2。这个人也有一些给他自己的序列号。

现在的任务包括检查TABLE1,找出每个唯一序列号需要多少数量。
举个例子:
https://www.db-fiddle.com/f/8eSUQCwM3NwNDSHJmATycp/3

如果你运行这个例子,你会看到:
“55555”- 2个数量
“12345” - 1数量
“33333”- 2个数量

现在我们知道食谱由内容组成,我必须检查人体1和person2是否有这些项目。它无论是什么人统1和人员都在单独拥有什么,只要总结在一起的所需金额就可以了。

请记住,表2和表3中的实际数量列与其有任何关系。我们必须拥有具有该术语序列号的平等或多项唯一行。

从我已链接的示例中,您可以看到表2(person1)具有:
2个“55555”数量
1个“33333”数量
在这个场景中,我将数量称为唯一行

和该表3(person2)有:
1个“33333”数量
1个“12345”数量


两人之间的总数量(表2和表3)为:
2个“55555”数量
2数量“33333”
1个“12345”数量
这与配方的要求完全正如食谱所需的那样,所以一切都很好,但是,如果缺少某些东西,则程序应返回错误。


我真的不知道如何构建这个查询来对person1和person2之间的所有序列求和,并将其与菜谱进行比较。有人能帮帮我吗?
zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
你是否建议我读取所有3个表,并存储所有的值作为变量,然后做一个比较?我相信这是一种方法,但是我不认为这将是一个有效的方法(从3表来存储所有的变量),然后做一个比较,我可以做一个比较查询,不需要内存储任何变量
班

2019年1月27日加入
2,760.
你是否建议我读取所有3个表,并存储所有的值作为变量,然后做一个比较?我相信这是一种方法,但是我不认为这将是一个有效的方法(从3表来存储所有的变量),然后做一个比较,我可以做一个比较查询,不需要内存储任何变量
不,我不建议您将整个表读入一个数组。您可以执行只返回相关记录的查询,然后使用Python比较它们。您可以创建一个存储过程,并使用Python的灵活性,而不是处理SQL。

签出MySQL中的存储过程。
zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
是的,我认为你是对的。我已经读了关于存储过程,它似乎是我正在寻找的,然而,我想分享的结果,我已经得到了如此快,因为我认为我非常接近实现我需要的。

mysql:
https://www.db-fiddle.com/f/8eSUQCwM3NwNDSHJmATycp/7

第一个查询返回表1的数据,这是我需要的每个序列号和数量的数据。知道这一点,我可以用每个串行嵌套循环和查询表2和表3,并检查该序列号的计数(*)的总和。当我在db-fiddle测试时似乎有效(运行询问并查看最后两个结果)

然而,我不能在我的python程序中重现同样的事情:

代码:
sql = "SELECT Serial, count(*) as NUM FROM {table} GROUP BY Serial" cur.execute(sql.format(table=table_name)) for Serial,number in cur.fetchall():打印(“连环需要= ",串行)打印(“这系列的数量=”,数字)sql2 = "选择SUM (total_count) total_count从(SELECT count(*)从Raspberry1_data2 total_count串行= % s UNION ALL SELECT count(*)从Raspberry2_data2串行= % s)作为一个“结果= cur.execute (sql2系列,系列)# sql2 = "选择串行,count (*)Raspberry1_data2 WHERE Serial=%s UNION ALL SELECT Serial,count(*) FROM Raspberry2_data2 WHERE Serial=%s" print("result asnwer=",result)
由于它的第二个呼叫是不对的,因为它以奇怪的格式返回结果:
代码:
Serial need to take= an000002 Number of that Serial = 1 result asnwer= Serial need to take= at000003 Number of that serial = 2 result asnwer=  Serial need to take= ps000001 Number of that serial = 2 result asnwer= 
它应该从两个表中返回一个表的数量(*),以获得一个我作为变量(%s)的特定序列号

我也尝试使用fetchall():
代码:
sql = "SELECT Serial, count(*) as NUM FROM {table} GROUP BY Serial" cur.execute(sql.format(table=table_name)) for Serial,number in cur.fetchall():打印(“连环需要= ",串行)打印(“这系列的数量=”,数字)sql2 = "选择SUM (total_count) total_count从(SELECT count(*)从Raspberry1_data2 total_count串行= % s UNION ALL SELECT count(*)从Raspberry2_data2 total_count串行= % s) total_count”cur.execute (total_count sql2系列,系列)cur.fetchall():打印(“结果说= ",total_count)
结果如下:
代码:
mysql.connector.errors.InterfaceError:没有结果集获取。
最后的编辑:
班

2019年1月27日加入
2,760.
我会为您在MySQL和Python之间进行熟悉的人来留下这个。我真的无法帮助那个,我没有一起用一起。
m

MRSALTS.

加入2020年4月2日
220
通过在表2中多设置一列“个人号码”,您的问题将大大简化。然后可以删除表3。您可以简单地确定每个库存项目是属于person1还是person2,并从表2查询所有库存数量。
zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
我明白你的意思,但我不知道这对我的特殊任务是否是个好主意。情况是:
PART1的任务:
一个人正在扫描一个项目的条形码,然后向拥有该特定项目的所有信息的服务器发出API请求。然后创建一个table1并将该信息存储在那里。
第二部分的任务:
我将table2和table3与我刚刚从table1中读取的内容进行比较,并确定是否可以继续执行某个任务。我将数据保存在table1中,因为它可以进一步分割,但解释起来相当复杂。
任务完成后,我删除了表1并等待人扫描另一个项目
m

MRSALTS.

加入2020年4月2日
220
我认为你需要更好地了解你的库存可以拥有的各种“国家”。
同样,你不需要创建和删除表-你不应该创建和删除表理想情况下,你不应该删除任何东西。你实质上是在制作一个ERP系统(至少是ERP的库存部分)

理想情况下,您应该在您的库存表中添加更多的列,以显示每种成分的每个批号的状态。这类似于SAP中的物料移动表。

同样,你正在使用一个类似于变量的表,它应该是一个包含数千或数十万事务的列表。

你的材料55555数量应该被制造商跟踪和追踪,制造商位置和批号,数量和状态。

状态可以是;每个状态更改都应有时间戳
-未决的质量检查
-可供使用
-承诺(特定批次的使用)和承诺的数量
转出(实际已发送)
- 返回库存(取消使用)
- 不妥协(取消计划使用)
然后,您可以对该表运行查询以不断向您展示可用的数量,或者它可以向您展示您想要。
BobaMosfet

BobaMosfet

加入2009年7月1日
1553年
你好。我在开发程序在python和需要做一些复杂的MYSQL查询涉及3表。

TABLE1 -由“配方”数据组成。它描述了我们需要的序列号和数量

TABLE2 -想象这是人1。这个人有一些给他自己的序列号。

TABLE3 -想象这是人2。这个人也有一些给他自己的序列号。

现在的任务包括检查TABLE1,找出每个唯一序列号需要多少数量。
举个例子:
https://www.db-fiddle.com/f/8eSUQCwM3NwNDSHJmATycp/3

如果你运行这个例子,你会看到:
“55555”- 2个数量
“12345” - 1数量
“33333”- 2个数量

现在我们知道食谱由内容组成,我必须检查人体1和person2是否有这些项目。它无论是什么人统1和人员都在单独拥有什么,只要总结在一起的所需金额就可以了。

请记住,表2和表3中的实际数量列与其有任何关系。我们必须拥有具有该术语序列号的平等或多项唯一行。

从我已链接的示例中,您可以看到表2(person1)具有:
2个“55555”数量
1个“33333”数量
在这个场景中,我将数量称为唯一行

和该表3(person2)有:
1个“33333”数量
1个“12345”数量


两人之间的总数量(表2和表3)为:
2个“55555”数量
2数量“33333”
1个“12345”数量
这与配方的要求完全正如食谱所需的那样,所以一切都很好,但是,如果缺少某些东西,则程序应返回错误。


我真的不知道如何构建这个查询来对person1和person2之间的所有序列求和,并将其与菜谱进行比较。有人能帮帮我吗?
这里:

山姆在10分钟内让自己的SQL
作者:山姆的出版
isbin-10:0-672-31664-1

这是家庭作业吗?
m

MRSALTS.

加入2020年4月2日
220
不幸的是,“10分钟自学sql”的书籍从来没有谈到建立关系数据库的策略,在不重复数据对的情况下建立表,同时最小化搜索工作量(时间)。从我的观点来看,OP比10分钟更深入地了解他的sql知识,现在OP需要一些指导
ApacheKid

ApacheKid

加入2015年1月12日
384.
这里存在一些问题,最大的问题是每个“人”都有一个专用的表。

与两个表(table2和table3)不同,您可以使用一个表来附加一个列——PersonID。

这意味着您只有两个表,无论您需要多少“人”,只需两个表将代表数据。

然后完成此操作,您可以编写更好的查询,也许使用串行连接以获取所需的内容,同时牢记SQL也支持SUM()操作。

如果要求坚持使用每人一张桌子,那么问题仍然可以解决,而是检查,这是绝对要求的吗?
zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
这里存在一些问题,最大的问题是每个“人”都有一个专用的表。

与两个表(table2和table3)不同,您可以使用一个表来附加一个列——PersonID。

这意味着您只有两个表,无论您需要多少“人”,只需两个表将代表数据。

然后完成此操作,您可以编写更好的查询,也许使用串行连接以获取所需的内容,同时牢记SQL也支持SUM()操作。

如果要求坚持使用每人一张桌子,那么问题仍然可以解决,而是检查,这是绝对要求的吗?

首先,非常感谢所有的技巧。我将更多地解释这个项目。这不是在线商店数据库或其他东西。如果您听说过它的“挑选光”系统。这是一个旨在帮助仓库运营商包装正确事物的系统。


一个负责的人生成一个菜谱并将其放入服务器中。当操作员扫描空盒子上的条形码时,我的系统用该代码向服务器发出API请求,我得到了仓库操作员需要为这个特定盒子收集的物品。有了这些数据,我创建了一个table1并将数据存储在那里。我可能会保留我创建的所有表,只是为了记录。在今天结束的时候,我将能够看到已经打包了多少个箱子。所有项目都有唯一的序列号,因此它有意义的排序他们的基础上,这是我正在做的。

关于系统的更多信息......:

有两名仓库操作员正并肩工作在这个系统上。因此有两个独立的系统。系统的核心是树莓派。两个仓库操作符都有自己的“工作区”,这就是为什么我决定为每个操作符创建一个mysql表的原因。

表2和表3只是表示了这个人的“工作区域”上可用的项目。如果一个人1不能完全完成特定的盒子-没有问题,留下1或2项,这个人2将完成它(这就是我最初的问题,我必须检查这个盒子是否能在两个人之间完成)

第一个人总是开始打包东西,第二个人总是完成第一个人没有放进盒子里的东西。如果食谱中的某一项物品不在个人工作区域内,person1将被要求携带该物品,否则他将无法继续工作。

希望这更清楚,我应该在一开始就解释清楚。


是的,你是对的,可能不需要两张单独的桌子,我只是想这样会更容易跟踪每个工作场所分配的项目。
zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
我已经把所有东西放在一个表中,正如你所建议的,并取得了一些进展,我的MYSQL。我对它了解得越来越多。
看一下这个:
https://www.db-fiddle.com/f/8eSUQCwM3NwNDSHJmATycp/25

正如您所看到的,最后一个查询能够在表中找到串行匹配数。但是,我在Python中复制了相同的查询,它抱怨语法:

代码:
sql = "SELECT Serial, count(*) as NUM FROM {table} GROUP BY Serial" cur.execute(sql.format(table=table_name)) for Serial,number in cur.fetchall():print("Number of that Serial need to take=", Number) sql2 =" SELECT count(*) FROM Raspberry_data WHERE Serial=%s" curr .execute(sql2,Serial) for answer, in curr .fetchall(): print("Number of Serial exist between both =",answer) if(Number > answer):print("cannot finish this code, missing item=",Serial) string =" cannot finish this code, missing item="+Serial label_RED.config(text=string) master. print("cannot finish this code, missing item=",Serial)在(5000,lambda: app.refresh_app2())返回之后
新的查询是:
SQL2 =“从Raspberry_Data中选择Count(*),其中erial =%s”
cur.execute(sql2,串行)

我不明白它为什么要抱怨?
代码:
mysql.connector.Errors.ProgrammingError:1064(42000):您的SQL语法中有错误;检查与Mariadb Server版本对应的手册,以便在第1行使用的右语法使用
最后的编辑:
zazas321

螺纹启动器

zazas321

2015年11月29日加入
848
我已经解决了我的python查询的问题。当你在mysql查询中使用变量时,你必须把它们作为元组:

以下是不正确的
代码:
SQL2 =“从Raspberry_data中选择count(*),其中erial =%s”cur.execute(sql2,串行)
下面是正确的
代码:
sql2 = "SELECT count(*) FROM Raspberry_data WHERE Serial=%s" curr .execute(sql2, (Serial,))