mysql - 从具有不同搜索结果的表中提取数据

标签 mysql sql

我正在尝试从包含先前搜索结果的表中提取数据。我对数据库查询不是很熟悉,并且做了一个会因占用过多内存而使我的计算机崩溃的查询。

此数据来自电路板测试仪,我需要某些信息。

  1. 在给定时间段内运行了多少板
  2. 失败了多少
  3. 这些板的所有故障数据编辑:这是我需要弄清楚的数据。请参阅底部的编辑。

第一次运行板时,它会在板表中创建一条记录

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

...结果存储在Results中

+-----------+---------+--------+-------------+-------------+
| 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 个单独的搜索,我获得了解析所需信息所需的所有数据。接下来将找到一种方法来查询数据库而不是解析。

最佳答案

我觉得你想多了。您不需要所有内联 View 。下面是我将如何使用 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“转换”的列。

关于mysql - 从具有不同搜索结果的表中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46593625/

相关文章:

mysql - 安装 Xampp 启动 MySql 服务出错

php - 如何加快 MySQL 表中的搜索(无索引)

sql - 无法在 Redshift 上将 JOIN 与generate_series 一起使用

mysql - SQL - 为什么这 3 个查询的结果不相加?

mysql - 多对多关系,使查询不那么复杂

php - 单击浏览器的后退按钮后保留表单值

sql - MSSQL : Update statement avoiding the CHECK constraint

sql - Django - 使用 PostgreSQL Inner Join 对多对多关系进行 SQL 查询

三个表之间的 MySQL 查询(还有 ORDER 和 LIMIT)

php - SQL - 如何获取创建的同一日期的最新数据