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