查询优化:选择结果集的最小值,其中一列是另一组的最大值

时间:2019-03-20 14:53:02

标签: mysql sql query-optimization

我正在尝试优化查询,但遇到了一些困难。

请考虑以下表格结构。如果您希望自己构建表,我还提供了一些SQL:

| id | test_run_id | test_case_id |  test_step_id | test_result |
|----|-------------|--------------|---------------|-------------|
| 1  |      1      |       3      |      1        |      1      |
| 2  |      1      |       3      |      2        |      1      |
| 3  |      1      |       3      |      3        |      0      |
| 4  |      2      |       3      |      1        |      1      |
| 5  |      2      |       3      |      2        |      1      |
| 6  |      2      |       3      |      3        |      1      |

CREATE TABLE test_results(
    id INT(10) AUTO_INCREMENT,
    test_run_id INT(10) DEFAULT 0,
    test_case_id INT(10) DEFAULT 0,
    test_step_id INT(10) DEFAULT 0,
    test_result  CHAR(1) DEFAULT 0,
    PRIMARY KEY(id)
);

INSERT INTO test_results(
    `test_run_id`,
    `test_case_id`,
    `test_step_id`,
    `test_result`
) VALUES (
    1,
    3,
    1,
    1
), (
    1,
    3,
    2,
    1
), (
    1,
    3,
    3,
    0
), (
    2,
    3,
    1,
    1
), (
    2,
    3,
    2,
    1
), (
    2,
    3,
    3,
    1
);

现在,我想获取最新的结果集作为查询的一部分。我知道我可以这样做:

SELECT
    MIN( test_result ) as 'last_run_lowest'
FROM test_run_results
WHERE test_case_id=tc.id
AND test_run_id=(
    SELECT
        MAX( test_run_id )
    FROM test_run_results
    WHERE test_case_id=tc.id
)

那将返回我一行:

| last_run_lowest |
|-----------------|
|       1         |

我要这样做,因为值1表示最后一次测试通过了。但是,由于我的test_run_results表中的结果量很大,以这种方式进行处理会花费很多时间。

我想找出的是,是否有一种更有效的方法来返回相同的数据,从而使查询不会花费那么长时间。

预先感谢

1 个答案:

答案 0 :(得分:2)

如果只需要一个值,为什么不这样做呢?

SQL Server版本:

Select Top 1 test_result
from test_results
order by Test_run_ID desc, test_result asc

每个注释,MySQL版本:

Select test_result
from test_results
order by Test_run_ID desc, test_result asc
limit 1;