2016-09-17 1 views
0

私は実際に私に非常に多くの悲しみを引き起こしている面白い問題があります。何百行ものデータを別のテーブルのデータと比較する

私は2つのテーブルがメイクアップで同じです。 1つのテーブルは抽選で勝利した宝くじ番号を保持し、もう1つのテーブルはその抽選のために500個のランダムに生成された「チケット」を保持する。

私は、500個のチケットのうちどれが3個の一致する番号、4個の一致する番号、5個の一致する番号、そしてもちろん6個の一致する番号を持っているかを教えてくれるコードを書こうとしています。

両方のテーブルのテーブル構造は

ID、playDate、NUM1、NUM2、NUM3、num4、num5、num6あります。

ここに私がいる場所があります。誰もが何も言わないうちにこれが正しいとは限りません。本当にここに苦労:

SELECT count(*) AS c, w.*, l.* 
FROM winningNums AS w, lottoNums AS l 
WHERE w.playDate = "2016-10-10" 
AND l.playDate = "2016-10-10" 
AND l.num1 (
w.num1, w.num2, w.num3, w.num4, w.num5, w.num6 
) 

を私もこの周り

SELECT * 
FROM winningNums AS w 
INNER JOIN lottoNums AS l 
ON w.playDate = l.playDate 
AND w.num1 = l.num1 
AND w.num2 = l.num2 
AND w.num3 = l.num3 
AND w.num4 = l.num4 
AND w.num5 = l.num5 
AND w.num6 = l.num6 

私が直面しています主な問題は、3試合の勝利はNUM1から来る可能性があることです、NUM3のようなものを打撃、とされてきましたnum2、num5、num6(当選番号からの)と一致するnum4(チケットから)。

+3

あなたのデータではなく2列playDateとlottoNumbrerは各playDateのための6行を持っている正規化します。あなたの参加は簡単です。 – Niagaradad

+1

@ Niagaradadと合意 - これはデータ正規化の古典的な例です。 –

+0

私はあなたが何を意味するかは分かりませんが、少なくともそれはリードです。正しい方向に私を指してくれてありがとう。私は正規化の研究に行きます。以前はそれを見ていませんでした。 –

答えて

2
SELECT l.*, 
    (l.num1 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) + 
    (l.num2 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) + 
    (l.num3 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) + 
    (l.num4 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) + 
    (l.num5 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) + 
    (l.num6 IN (w.num1, w.num2, w.num3, w.num4, w.num5, w.num6)) 
    AS hits 
FROM winningNums AS w 
CROSS JOIN lottoNums AS l 
WHERE w.playDate = "2016-10-10" 
    AND l.playDate = "2016-10-10" 
HAVING hits >= 3 
ORDER BY hits DESC 

:-)

ヘルプこれは、宝くじからのすべての番号と、チケットからすべての数を比較します。すべてのヒット/マッチが追加されます。

+0

これは素晴らしいですが、このエラーが発生しました。「SQL構文に誤りがあります。MySQLサーバのバージョンに対応したマニュアルをチェックして正しい構文を確認してください。 '+ l.num2 IN(w.num1、w。 num2、w.num3、w.num4、w.num5、w.num6)+ l.num3 IN '2行目' –

+0

カッコがありませんが、これはすべてうまく機能しているようです。ありがとうございました。 –

0

INステートメントを使用すると、1または0を返す一致を見つけることができます。 その後、HAVINGを使用して> = 3のように一致を確認します。

SELECT lot.id as lotid,draw.id as drawid, 
    (draw.num1 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6)) 
    + (draw.num2 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6)) 
    + (draw.num3 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6)) 
    + (draw.num4 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6)) 
    + (draw.num5 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6)) 
    + (draw.num6 IN (lot.num1,lot.num2,lot.num3,lot.num4,lot.num5,lot.num6)) 
    AS matches 
FROM lot 
    INNER JOIN draw 
HAVING matches >= 3; 

sqlfiddle

関連する問題