2016-07-19 3 views
0

免責事項:私はMySQLには新しく、詳細を知るための実験として行っています。1行と複数行の類似性を確認する

基本的には、1つの行が「マスター」行であるテーブルがあります。私はこの行を他のいくつかの行と比較したい。それから、私は、マスター行と最も「正しい」または類似のものを選択し、それを変数に格納したいと考えています。少数の行のどれもがマスターに似ていない場合は、操作をキャンセルしたいだけです。

私は反復でこれを行う方法を考えることができますが、反復は非常に非効率的であることを読んでいます/ SQLの悪い習慣と別の方法があるかどうかを見たいと思います。この例では

、私はしかし、次の例では、私は2つにもかかわらず、提出1を選択したいと思い提出2を選択したい、と提出1と3

Type, Answer 1, Answer 2, Answer 3 
Master, 100, 200, 300 
Submission 1, 100, 400, 300 
Submission 2, 100, 200, 300 
Submission 3, 200, 100, 300 

を拒否したいですまったく同じではありません。それは2が正しいのと同程度であるにもかかわらず、服従3の前に発生したとして

Type, Answer 1, Answer 2, Answer 3 
Master, 100, 200, 300 
Submission 1, 100, 400, 300 
Submission 2 , 100, 500, 500 
Submission 3, 200, 100, 300 

最後に、ここで私は、提出1を選択したいと思います。

Type, Answer 1, Answer 2, Answer 3 
Master, 100, 200, 300 
Submission 1, 100, 400, 300 
Submission 2 , 100, 500, 500 
Submission 3, 500, 200, 300 
+0

を含めることはできますか? –

+0

絶対に - 私は今それを追加します。 – GeoGeoGeometry

+0

@Drew LOL ...あなたのコメントは素晴らしいです。 –

答えて

1

次のクエリを試してみてください。これは、Master行がお互いの行と共通に持つ回答の数を計算します。そして、正しい答えの数によって結びつけられた場合、それはそれぞれの間違った答えからの数値の差を使って最も近いものを選ぶ。

SELECT t.Type, t.Answer1, t.Answer2, t.Answer3, 
     (t.a1 + t.a2 + t.a3) AS numRight, 
     (t.d1 + t.d2 + t.d3) AS numOff 
FROM 
(
    SELECT t2.Type, t2.Answer1, t2.Answer2, t2.Answer3, 
      CASE WHEN t1.Answer1 = t2.Answer1 THEN 1 ELSE 0 END AS a1, 
      CASE WHEN t1.Answer2 = t2.Answer2 THEN 1 ELSE 0 END AS a2, 
      CASE WHEN t1.Answer3 = t2.Answer3 THEN 1 ELSE 0 END AS a3, 
      ABS(t1.Answer1 - t2.Answer1) ASd1, 
      ABS(t1.Answer2 - t2.Answer2) AS d2, 
      ABS(t1.Answer3 - t2.Answer3) AS d3 
    FROM yourTable t1 INNER JOIN yourTable t2 
     ON t1.Type = 'Master' AND t2.Type <> 'Master' 
) t 
ORDER BY numRight DESC, numOff 

あなただけの1行をしたい場合は、クエリの最後にLIMIT 1を追加することができます。ここ

デモ:あなたは、サンプル表を

SQLFiddle

+0

ありがとう!これは私が思いついた解決策よりもはるかに簡潔です。 – GeoGeoGeometry

関連する問題