Mysql 使用不同搜索的结果从表中提取数据
我正在尝试从具有上一次搜索结果的表中提取数据。我对数据库查询不是很熟悉,我已经做了一个数据库查询,它会因为占用太多内存而使我的计算机崩溃 这些数据来自一个板测试仪,我需要一些信息 在给定的时间段内运行了多少个板 有多少人失败了 这些电路板的所有故障数据编辑:这是我需要弄清楚的。请参见底部的“编辑”。 第一次运行线路板时,它会在线路板表中创建一条记录Mysql 使用不同搜索的结果从表中提取数据,mysql,sql,Mysql,Sql,我正在尝试从具有上一次搜索结果的表中提取数据。我对数据库查询不是很熟悉,我已经做了一个数据库查询,它会因为占用太多内存而使我的计算机崩溃 这些数据来自一个板测试仪,我需要一些信息 在给定的时间段内运行了多少个板 有多少人失败了 这些电路板的所有故障数据编辑:这是我需要弄清楚的。请参见底部的“编辑”。 第一次运行线路板时,它会在线路板表中创建一条记录 +----------+-------+-----+ | Board_id | Board | rev | +----------+-------+
+----------+-------+-----+
| Board_id | Board | rev |
+----------+-------+-----+
| 1 | 1234 | 1 |
| 2 | 1234 | 1 |
| 3 | 1235 | 2 |
| 4 | 5869 | 15 |
+----------+-------+-----+
每次运行电路板时,它都会创建一个测试记录
+----------+----------+---------+---------------------+
| Test_id | Board_id | Operator| Date_Time |
+----------+----------+---------+---------------------+
| 34 | 1 | 1 | 2017-08-02 09:13:34 |
| 35 | 1 | 1 | 2017-08-02 09:13:36 |
| 36 | 1 | 1 | 2017-08-02 09:13:39 |
| 37 | 2 | 1 | 2017-08-02 09:14:10 |
| 38 | 3 | 1 | 2017-08-02 09:16:24 |
| 39 | 3 | 2 | 2017-08-03 10:40:45 |
| 40 | 4 | 2 | 2017-08-03 10:43:34 |
+----------+----------+---------+---------------------+
…并将结果存储在结果中
+-----------+---------+--------+-------------+-------------+
| Result_id | Test_id | Result | Upper_Limit | Lower_Limit |
+-----------+---------+----------------------+-------------+
| 40 | 34 | 2 | 4 | 1 |
| 41 | 34 | 3 | 4 | 1 |
| 42 | 34 | 4 | 4 | 1 |
| 43 | 34 | 0 | 4 | 1 |
| 44 | 35 | 2 | 4 | 1 |
| 45 | 35 | 3 | 4 | 1 |
| 46 | 35 | 4 | 4 | 1 |
| 47 | 35 | 0 | 4 | 1 |
| 48 | 36 | 2 | 4 | 1 |
| 49 | 36 | 3 | 4 | 1 |
| 50 | 36 | 4 | 4 | 1 |
| 51 | 36 | 2 | 4 | 1 |
| 52 | 37 | 2 | 4 | 1 |
| 53 | 37 | 3 | 4 | 1 |
| 54 | 37 | 4 | 4 | 1 |
| 55 | 37 | 2 | 4 | 1 |
| 56 | 38 | 2 | 4 | 1 |
| 57 | 38 | 3 | 4 | 1 |
| 58 | 38 | 4 | 4 | 1 |
| 59 | 38 | 5 | 4 | 1 |
| 60 | 39 | 2 | 4 | 1 |
| 61 | 39 | 3 | 4 | 1 |
| 62 | 39 | 4 | 4 | 1 |
| 63 | 39 | 5 | 4 | 1 |
| 64 | 40 | 2 | 4 | 1 |
| 65 | 40 | 3 | 4 | 1 |
| 66 | 40 | 4 | 4 | 1 |
| 67 | 40 | 3 | 4 | 1 |
+-----------+---------+--------+-------------+-------------+
要获取给定时间段内运行的板数和板ID,我需要查询
SELECT a.Board_ID FROM
Tests a, Results b
WHERE a.Date_Time>='2017-08-02' AND a.Date_Time<'2017-08-03' and
a.Test_ID = b.Test_ID
group by a.Board_ID
获取与这些板ID的I查询相关的所有测试
SELECT * from
Tests x, (
SELECT a.Board_ID FROM
Tests a, Results b
WHERE a.Date_Time>='2017-08-02' AND a.Date_Time<'2017-08-03' and
a.Test_ID = b.Test_ID
group by a.Board_ID
) y
where x.Board_ID = y.Board_ID
这给了我正确的结果,但是查询似乎不成功,但是当我试图从上面的查询中获得失败的结果时,我遇到了最大的麻烦
SELECT d.Test_ID FROM
Boards a, Tests b, (
SELECT x.Test_ID, x.Board_ID, x.Operator, x.Date_Time from
Tests x, (
SELECT a.Board_ID FROM
Tests a, Results b
WHERE a.Date_Time>='2017-08-02' AND a.Date_Time<'2017-08-03' and
a.Test_ID = b.Test_ID
group by a.Board_ID
) y
)d
WHERE d.Test_ID = b.Test_ID and
b.Result not between Lower_Limit and Upper_Limit
编辑:
如果你看一下我创建的测试表,你会发现board_id 3在两天内测试了两次。我需要查看我们在给定日期运行的板,例如2017-08-02,以及这些板的所有相关记录。因此,由于Board_ID 3是在2天内运行的,并且是在有问题的那一天运行的,所以我需要在我的查询中包含该记录
我的解决方案
从这里你可以看到,我有3个嵌套搜索到1个。通过3次单独搜索,我获得了解析所需信息所需的所有数据。下一步是找到一种方法来查询数据库,以获取我需要的信息,而不是解析。我想你想得太多了。您不需要所有的内联视图。下面是我将如何使用ANSI连接编写它,如注释中建议的@CptMisery
SELECT d.Test_ID FROM
Boards a, Tests b, ( SELECT x.Test_ID,
x.Board_ID,
x.Operator,
x.Date_Time
from Tests x,
(SELECT a.Board_ID
FROM Tests a, Results b
WHERE a.Date_Time>='2017-08-02'
AND a.Date_Time<'2017-08-03'
and a.Test_ID = b.Test_ID
group by a.Board_ID
) y
)d
WHERE d.Test_ID = d.Test_ID
and b.Result >= Lower_Limit
and b. Result <=Upper_Limit
SELECT d.test_id, b.board, b.board_rev, r.result_id, r.result -- and whatever else you need.
from tests t
join results r on t.test_id = r.test_id
join boards b on t.board_id = b.board_id
where t.Date_Time>='2017-08-02' AND t.Date_Time<'2017-08-03'
and r.result >Lower_Limit -- or >=
and r.result < Upper_Limit -- or <=, if it can be the limit value
根据表的外键与主键的关系联接所有表,在where子句中选择过滤器,然后选择要使用Select进行项目的列 请检查您是否正确粘贴了最后一个查询。它突然以and结尾,我还看到d.Test\u ID=d.Test\u ID,我向您保证这永远是真的:您还应该考虑使用内部联接和左外部联接。逗号分隔表在20-30年前很流行,并且在某个时候会停止工作,希望你实际上什么都不算。那么,为什么是总量呢?为什么是子查询?只需检查两列的数据类型是否相同,并将d.Test\u ID=d.Test\u ID替换为d.Test\u ID=b。测试ID正确的代码将是从板a中选择d.测试ID,测试b,从测试x中选择x.测试ID,x.板ID,x.操作员,x.日期时间,从测试a中选择a.板ID,结果b,其中a.日期时间>='2017-08-02'和a.日期时间=下限和b。结果凯文,这几乎让我得到了我想要的东西。如果你看一下我创建的测试表,你会发现board_id 3在两天内测试了两次。我需要查看我们在某一天运行的板以及这些板的所有相关记录。想法?我错过了所有相关测试的细节。这个问题将混合我的答案和你最初的尝试。稍后我将尝试编辑。使用联接和嵌套搜索的组合来获取我想要的数据。
SELECT d.test_id, b.board, b.board_rev, r.result_id, r.result -- and whatever else you need.
from tests t
join results r on t.test_id = r.test_id
join boards b on t.board_id = b.board_id
where t.Date_Time>='2017-08-02' AND t.Date_Time<'2017-08-03'
and r.result >Lower_Limit -- or >=
and r.result < Upper_Limit -- or <=, if it can be the limit value