使用来自不同搜索的结果从表中提取数据

时间:2017-10-05 19:42:35

标签: mysql sql

我正在尝试使用先前搜索的结果从表中提取数据。我对数据库查询并不熟悉,并且已经制作了一个会导致我的计算机无法获取太多内存的问题。

这些数据来自电路板测试仪,我想要一些信息。

  1. 在特定时期内运行了多少个董事会
  2. 失败多少
  3. 这些主板的所有故障数据编辑:这是我需要弄清楚的。请参见底部的编辑。
  4. 第一次运行一个电路板时,它会在Board表中创建一条记录

    +----------+-------+-----+
    | 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           |
    +-----------+---------+--------+-------------+-------------+
    

    为了获得电路板数量和Board_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
    

    要对我查询的Board_ID进行所有相关测试。

    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天内运行,并且在当天运行,我需要将该记录包含在我的查询中。

    我的解决方案

    SELECT * FROM 
    (
        SELECT x.Test_ID, x.Board_ID, x.Operator, x.Date_Time  from 
            Test x, (
                SELECT a.Board_ID  FROM    
                    Test a
                    join Results b on a.Test_ID = b.Test_ID
                WHERE a.Date_Time>='2017-08-11' AND a.Date_Time<'2017-08-12' 
                    group by a.Board_ID
            ) y
        where x.Board_ID = y.Board_ID
    )d
        join Boards a on a.Board_ID = d.Board_ID
        join Results b on b.Test_ID = d.Test_ID
        join Test_Names c on c.Test_Name_ID = b.Test_Name_ID --Table Not shown
    WHERE
        b.result not between Lower_Limit and Upper_Limit 
    

    从这里你可以看到我有3个嵌套搜索到1.通过3次单独搜索,我获得了解析所需信息所需的所有数据。接下来将找到一种方法来查询数据库以获取我需要的内容而不是解析。

2 个答案:

答案 0 :(得分:2)

我认为你是在思考这个问题。您不需要所有内联视图。以下是我使用ANSI连接编写的方法(如评论中建议的@CptMisery)

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选择要“项目”的列。

答案 1 :(得分:0)

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