我有一个数据库,我想在那里建立一个结果,符合我的数据。
示例说明:
“Indata”是一行,包含步骤1中过滤器的条件,请参见下文。
“筛选后的结果”是步骤1后的剩余行
“过滤后的结果”是步骤2后的行
“Print for indata 1”是最终结果,显示第二次筛选后字段OutData的内容,以及字段“Warn”的组合内容
步骤1。筛选Outdata表以仅保留与Indata匹配的记录。星*可以匹配任何东西。每行必须与indata行匹配。参见示例。
步骤1b.Indata Depl不直接匹配,但被检查为超出数据范围
深度DeplOffMin>Indata深度
步骤2。再次筛选OutDATA表,只为每个POS保留唯一行,在存在重复时选择具有最低错配的行。参见示例。
步骤3。创建Outdata字段的所有可能组合,使用唯一的Pos.Like循环:Outdata for first Pos=10+Outdata for first Pos=20+Outdata for first Pos=30+Outdata for first Pos=30,请参见示例中的“打印”行。
步骤4。对输出组合(即“打印”行)进行排序,使顶部的不匹配度最低。参见示例。
你会试着把它作为一个大的SQL查询,或者构建临时表,和PHP混合起来做更多的工作吗?
(真正的数据库可能是MySQL中的1000行和30个字段。in data通过Ajax发送到服务器,PHP中的服务器代码生成打印数据并将其发回。)
"Outdata" table, example:
Pos OutData Warn Mismatch Producer Depl DeplOffMax DeplOffMin Axis Connection
10 S 0 S * * * * *
20 24 0 S 24 * * * *
20 24 +-5 5 S 24 5 -5 * *
20 24 +-10 10 S 24 10 -10 * *
20 48 0 S 48 * * * *
30 AA 0 S * * * A *
30 AB 0 S * * * B *
30 AC 0 S * * * C *
30 AA B-AA 5 S * * * B
40 C1 0 S * * * * C1
40 C1 1 S * * * B *
40 C1 2 S 24 10 -10 * *
40 C2 0 S * * * * C2
Example 1:
Indat 1: S 24 A C2
Result for indata 1 after filter #1:
10 S 0 S * * * * *
20 24 0 S 24 * * * *
20 24 +-5 5 S 24 5 -5 * *
20 24 +-10 10 S 24 10 -10 * *
30 AA 0 S * * * A *
40 C1 2 S 24 10 -10 * *
40 C2 0 S * * * * C2
Result for indata 1 after filter #2:
10 S 0 S * * * * *
20 24 0 S 24 * * * *
30 AA 0 S * * * A *
40 C1 2 S 24 10 -10 * *
40 C2 0 S * * * * C2
Print for indata 1:
Mismatch 0: S 24 AA C2 Warning -
Mismatch 2: S 24 AA C1 Warning -
Example 2:
Indata 2: S 33 B C2
Result for indata 2 after filter #1:
10 S 0 S * * * * *
20 24 +-10 10 S 24 10 -10 * *
30 AB 0 S * * * B *
30 AA B-AA 5 S * * * B
40 C1 1 S * * * B *
40 C1 2 S 24 10 -10 * *
40 C2 0 S * * * * C2
Result for indata 2 after filter #2:
10 S 0 S * * * * *
20 24 +-10 10 S 24 10 -10 * *
30 AB 0 S * * * B *
30 AA B-AA 5 S * * * B
40 C1 1 S * * * B *
40 C2 0 S * * * * C2
Print for indata 2:
Mismatch 10: S 24 AB C2 Warning: +-10
Mismatch 11: S 24 AB C1 Warning: +-10
Mismatch 15: S 24 AA C2 Warning: +-10 B-AA
Mismatch 16: S 24 AA C1 Warning: +-10 B-AA
Example 3:
Indata 3: S 28 B C1
Result for indata 3 after filter #1:
10 S 0 S * * * * *
20 24 +-5 5 S 24 5 -5 * *
20 24 +-10 10 S 24 10 -10 * *
30 AB 0 S * * * B *
30 AA B-AA 5 S * * * B
40 C1 0 S * * * * C1
40 C1 1 S * * * B *
40 C1 2 S 24 10 -10 * *
Result for indata 3 after filter #2:
10 S 0 S * * * * *
20 24 +-5 5 S 24 5 -5 * *
30 AB 0 S * * * B *
30 AA B-AA 5 S * * * B
40 C1 0 S * * * * C1
Print for indata 3:
Mismatch 5: S 24 AB C1 Warning: +-5
Mismatch 10: S 24 AA C1 Warning: +-5 B-AA
最佳答案
我不知道第3步是什么意思,但所有其他步骤都可以用SQL来完成,而且,它们可能应该用SQL来完成,因为SQL效率更高。
我从你的标签上假设你正在使用一个MySQL数据库(如果知道的话会有帮助)。
我最初的想法大致是:
SELECT outdata.Pos,
outdata.OutData,
outdata.Warn,
MIN(outdata.Mismatch),
outdata.Producer,
outdata.Depl,
outdata.DeplOffMax,
outdata.DeplOffMin,
outdata.Axis
outdata.Connection
FROM outdata, indata
WHERE
(//some nasty type juggling here
outdata.depl='*'
OR outdata.deploffmin='*'
OR indata.depl='*'
OR (
outdata.depl<>'*'
AND outdata.deploffmin<>'*'
AND indata.depl<>'*'
AND outdata.depl-outdata.deploffmin>indata.depl
)
)
AND ( outdata.outdata=indata.outdata
OR outdata.outdata='*'
OR indata.outdata='*' )
AND ( outdata.connection=indata.connection
OR outdata.connection = '*'
OR indata.connection='*' )
AND (outdata.axis=indata.axis
OR outdata.axis='*'
OR indata.axis='*' )
....repeat for all the fields you want to match
GROUP BY outdata.Pos,
outdata.OutData,
outdata.Warn,
outdata.Producer,
outdata.Depl,
outdata.DeplOffMax,
outdata.DeplOffMin,
outdata.Axis
outdata.Connection
ORDER BY 4 ASC;
太简单了。
C。