Mysql 涉及多表的SQL查询设计

Mysql 涉及多表的SQL查询设计,mysql,sql,join,Mysql,Sql,Join,我正在进行MYSQL查询设计,在我看来,这相当困难。我对SQL没有经验,所以我觉得它很难。重点是: 我有一个“ordertable”表,它存储一些代码(AA、BB、CC..)的顺序。在另一个表中,“AllTables”存储与代码关联的表的名称(AA->tableA)。最后,“tableA”表存储不同单位(单位1、单位2…)的一些数据 案例1. 订单表:代码的顺序如下所示: +----------------+------+ | split_position | code | +---------

我正在进行MYSQL查询设计,在我看来,这相当困难。我对SQL没有经验,所以我觉得它很难。重点是:

我有一个“ordertable”表,它存储一些代码(AA、BB、CC..)的顺序。在另一个表中,“AllTables”存储与代码关联的表的名称(AA->tableA)。最后,“tableA”表存储不同单位(单位1、单位2…)的一些数据

案例1. 订单表:代码的顺序如下所示:

+----------------+------+
| split_position | code |
+----------------+------+
|              1 | AA   |
|              2 | BB   |
|              3 | CC   |
|              4 | DD   |
+----------------+------+
+-------+------+------+------+------+
| id    | pos1 | pos2 | pos3 | pos4 |
+-------+------+------+------+------+
| unit1 | AA   | BB   | DD   | CC   | 
| unit2 | CC   | BB   | AA   | DD   | 
| unit3 | BB   | DD   | CC   | AA   |
+-------+------+------+------+------+
案例2. 订单表代码的顺序如下所示:

+----------------+------+
| split_position | code |
+----------------+------+
|              1 | AA   |
|              2 | BB   |
|              3 | CC   |
|              4 | DD   |
+----------------+------+
+-------+------+------+------+------+
| id    | pos1 | pos2 | pos3 | pos4 |
+-------+------+------+------+------+
| unit1 | AA   | BB   | DD   | CC   | 
| unit2 | CC   | BB   | AA   | DD   | 
| unit3 | BB   | DD   | CC   | AA   |
+-------+------+------+------+------+
案例2中我们还可以找到类似“var15”的特殊代码:

+-------+------+-------+------+-------+
| id    | pos1 | pos2  | pos3 | pos4  |
+-------+------+-------+------+-------+
| unit1 | AA   | var15 | DD   | var37 | 
| unit2 | CC   | BB    | AA   | DD    | 
+-------+------+-------+------+-------+
如果我们发现类似于“var”+number的内容,则关联的表总是相同的:“variable”,其中de“id”是代码“var37”->id=37的编号

变量

+-----+------------+------+--------+
| id  | name       | time | active |
+-----+------------+------+--------+
| 15  | Pedro      |    5 |      1 |
| 17  | Maria      |    4 |      1 |
+-----+------------+------+--------+
表格信息:

所有表格

+------+------------+
| code | name       |
+------+------------+
| AA   | tableA     |
| BB   | tableB     |
| CC   | tableC     |
| DD   | tableD     |
+------+------------+
表a

+-------+------+------+--------+
| id    | name | time | active |
+-------+------+------+--------+
| unit1 | Mark |   11 |      1 |
| unit2 | Jame |   20 |      0 |
+-------+------+------+--------+
表B

+-------+------+------+--------+
| id    | name | time | active |
+-------+------+------+--------+
| unit1 | Mari |   44 |      1 |
| unit3 | nam2 |   57 |      1 |
+-------+------+------+--------+
给定一个id='unit1',我期待下一个:

结果

+----------------+------+-------+-------+--------+
| split_position | code |  name | time  | active |
+----------------+------+-------+-------+--------+
|              1 | AA   | Mark  |  11   |    1   |
|              2 | BB   | Mari  |  44   |    1   |
|              3 | CC   |       |       |    0   |
|              4 | DD   |       |       |    0   |
+----------------+------+-------+-------+--------+

如果id(unit1)不存在于tableC或tableD中,“split_position”和相关的“code”应该出现,但在“active”字段中应该出现一个0。

要解决您的问题,您需要以下内容:

select split_position, code, name, time, active
from
(
select 'tableA' as tablename, id, [name], [time], active
from tableA
union all select 'tableB' as tablename, id, [name], [time], active
from tableB
) as tbls
inner join alltables atbls
on tbls.tablename=atbls.name
inner join ordertable ot
on atbls.code=ot.code
where tbls.id='unit1'

这是一个有点陡峭的学习曲线,但基本上你必须声明一个游标和循环 遍历ordertable中的每一行,选择数据,然后使用动态SQL将结果合并在一起

检查这个


要按拆分位置ASC按最终结果排序,只需将拆分位置ASC的排序添加到sql变量中,然后像这样执行它即可

绝对奇妙!我印象深刻!它工作得非常好。是否有任何简单的方法可以通过拆分位置ASC排序最终结果?我做不到,谢谢你!正是我在寻找的。再次感谢!最后一个问题(我保证)。如果将“ordertable”作为案例2给出(请检查我的更新问题),那么很容易调整您所做的奇妙查询以获得相同的结果吗?如果您的ordertable与您所提到的案例2类似,那么您必须彻底更改存储过程,可能是类似这样的美妙事情!谢谢,我很抱歉。我不想在这里成为一个讨厌的人,Tin Tran,但我必须稍微修改一下你提出的这个令人敬畏的问题,没有你的帮助,我感到有点迷失方向。如你所见,我在问题中更新了案例2。你介意看一下这个,告诉我这是可行的还是真的很难?再次感谢:)