mysql通过比较两个关系来选择行的总和

时间:2012-03-29 07:53:23

标签: mysql database

我有来自两个部件列表的测试数据,称为in和out。我需要在最后一次测试之后为每个部件选择测试值的SUM,其中部件进入但没有出来。

IN LIST                 OUT LIST                 TEST
+--------+-----------+  +--------+------------+  +------+-------+
| testid | in_partid |  | testid | out_partid |  | test | value |
+--------+-----------+  +--------+------------+  +------+-------+
|      1 |        10 |  |      1 |         10 |  |    1 |     1 |
|      1 |        20 |  |      1 |         20 |  |    2 |    10 |
|      2 |        10 |  |      2 |         10 |  |    3 |   100 |
|      2 |        20 |  |        |            |  |      |       |
|      3 |        10 |  |      3 |         10 |  |      |       |
|      3 |        20 |  |      3 |         20 |  |      |       |
+--------+-----------+  +--------+------------+  +------+-------+

SUM非常简单,但是我可以将它限制为testid大于testid的那些行,这些行是上次检查的部分进入但没有出来的吗?

在这个例子中,第10部分应该SUM所有三个测试值,因为它包含在所有列表中,但是第20部分应该仅返回测试3的值,如在测试2中它不包括在in和out列表中。< / p>

partid  sum(value)
    10        111
    20        100

我可以使用mysql,还是需要在混合中包含php?

1 个答案:

答案 0 :(得分:1)

我认为您的示例输出不正确。我认为partid 20应该返回101,因为它在测试1和3的两个列表中都存在。假设我是对的,这个查询应该返回所需的结果

SELECT in_partid,SUM(value)
FROM (
    SELECT DISTINCT in_partid,inl.testid
    FROM in_list inl
    INNER JOIN out_list outl ON in_partid=out_partid AND inl.testid=outl.testid
    ) as tests_passed
  INNER JOIN tests ON tests_passed.testid=test
GROUP BY in_partid
编辑:基于OP的评论我的上述假设是错误的,实际上是一个要求。因此,这是一个我认为符合要求的查询:

SELECT tests_passed.in_partid,SUM(value)
FROM (
    SELECT DISTINCT inl.in_partid,IFNULL(last_failed_test,0) as last_failed_test
    FROM in_list inl LEFT JOIN (
        SELECT in_partid,MAX(inl.testid) as last_failed_test
        FROM in_list inl
        LEFT JOIN out_list outl ON in_partid=out_partid AND inl.testid=outl.testid
        WHERE outl.testid IS NULL
        GROUP BY in_partid
    ) AS last_passed
    ON inl.in_partid=last_passed.in_partid 
) as tests_passed
INNER JOIN tests ON tests_passed.last_failed_test<test
GROUP BY tests_passed.in_partid

这将返回上面给出的样本数据的样本结果。