2012-03-29 4 views
0

2つの部分のリストを出し入れしてテストしたデータがあります。私は、部品が入った最後のテストの後に各部品のテスト値のSUMを選択する必要がありますが、出てこなかった。mysqlは2つの関係を比較して行の合計を選択します

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は非常に簡単ですが、私はテストIDの一部が出で行きましたではなく、最後の検査のためにテストIDよりも大きい場合、それらの行にそれを制限することができますか?

この例では、すべてのリストに含まれているため、テスト3のすべての値をSUM 10で満たす必要がありますが、テスト2の場合と同じです。

partid sum(value) 
    10  111 
    20  100 

私はmysqlと一緒にやってもいいですか、あるいはミックスにphpを入れる必要がありますか?

+1

ネストされたSQLクエリまたはPHP。私は第二のものを好むだろう、なぜなら、最初のものが遅くなるからである。 – kirilloid

+0

それぞれのpartidをループして、outリストに含まれているかどうかを確認します。私はすべての可能性をチェックできる1つのmysqlクエリについて考えることはできません。私はまた、2-20がアウトリストにあるときに何が起こるのか、2-10はそうではないので、あなたが不足していると思いますか?おそらく同じ出力を得る必要がありますが、mysqlクエリは完全に異なる必要があります。 – Martin

+0

コメントありがとうございます。多分、私は部品をループし、最後の無差別なテストをnull LEFT OUTER JOINで取得し、そこから進んでいくでしょう。 – Juhani

答えて

1

あなたのサンプル出力があなたのロジックから間違っていると思います。私はそれは私がそれに右だと仮定すると、両試験1と3の両方のリストに存在しているようpartid 20が101を返すべきだと思う、このクエリは、所望の結果に

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 

EDITを返す必要があります: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 

これは、提供されたサンプルデータに対して上記のサンプル結果を返します。

+0

いいえ、それは正しいです。私は "異常"の後の結果にのみ興味があります。エレガントな提案ですが、残念ながらそれは私が必要とするものではありません。しかし、ありがとう。 – Juhani

+0

@Juhani [OK]を、私はその要件に対処する私の答えを更新しました。 – liquorvicar

+0

完全に動作します。あなたはウィザードです! – Juhani

関連する問題