2017-08-27 18 views
2

異なる順序で列の値に値のセットを一致:MySQLの:私は、日付と、このような整数でいくつかのフィールドを持つテーブルがある

SELECT * FROM numbers LIMIT 10; 

+----+------------+----+----+----+----+----+----+----+ 
| id | gen_date | n1 | n2 | n3 | n4 | n5 | n6 | n7 | 
+----+------------+----+----+----+----+----+----+----+ 
| 1 | 1990-12-27 | 22 | 43 | 18 | 23 | 16 | 7 | 0 | 
| 2 | 1990-12-19 | 39 | 11 | 38 | 23 | 24 | 36 | 0 | 
| 3 | 1990-12-12 | 44 | 12 | 10 | 48 | 14 | 4 | 0 | 
| 4 | 1990-12-05 | 2 | 4 | 5 | 46 | 48 | 49 | 0 | 
| 5 | 1991-12-25 | 10 | 2 | 44 | 49 | 29 | 34 | 0 | 
| 6 | 1991-12-18 | 6 | 19 | 42 | 4 | 12 | 28 | 0 | 
| 7 | 1991-12-11 | 1 | 12 | 42 | 7 | 31 | 25 | 0 | 
| 8 | 1991-12-04 | 18 | 47 | 31 | 30 | 10 | 35 | 0 | 
| 9 | 1991-11-27 | 38 | 33 | 39 | 47 | 13 | 11 | 0 | 
| 10 | 1991-11-20 | 23 | 7 | 22 | 18 | 43 | 16 | 0 | 
+----+------------+----+----+----+----+----+----+----+ 

をすべての行番号はユニークnx <> nyです。

値の順序に関係なく、列番号n1 to n6に対して6つの数値のセットを一致させたいと考えています。

たとえば、ID=1の行には、22, 43, 18, 23, 16, 7があり、ID=10の行には、同じ番号23, 7, 22, 18, 43, 16があります。私は、各行の列セット内のすべての数値を含む多くの行にクエリを書きました。数字7, 16, 18, 22, 23, 43を検索する必要がある場合、結果は両方ともID=1ID=10の両方の行を返します。

私はそれがこのようなすべてのフィールド値を通じて各番号を検索するFIELD機能を使って作業しました:

SELECT * FROM numbers 
WHERE 
FIELD(7, n1, n2, n3, n4, n5, n6) > 0 AND 
FIELD(16, n1, n2, n3, n4, n5, n6) > 0 AND 
FIELD(18, n1, n2, n3, n4, n5, n6) > 0 AND 
FIELD(22, n1, n2, n3, n4, n5, n6) > 0 AND 
FIELD(23, n1, n2, n3, n4, n5, n6) > 0 AND 
FIELD(43, n1, n2, n3, n4, n5, n6) > 0; 

+----+------------+----+----+----+----+----+----+----+ 
| id | gen_date | n1 | n2 | n3 | n4 | n5 | n6 | n7 | 
+----+------------+----+----+----+----+----+----+----+ 
| 1 | 1990-12-27 | 22 | 43 | 18 | 23 | 16 | 7 | 0 | 
| 10 | 1991-11-20 | 23 | 7 | 22 | 18 | 43 | 16 | 0 | 
+----+------------+----+----+----+----+----+----+----+ 

これは動作しますが、そのアプローチは、性能であれば、私はそれが動作する方法についていくつかの懸念を持っているし、数十万行の行に対して使用するときには賢明です。

このようなことを達成するにはもう1ついい(かもっと簡単な)方法がありますか?

+0

。しかし、あなたのデータ構造を正規化することなく、あなたはパフォーマンスの良いものを見つけるつもりはありません。 Sqlは列ではなく行で検索することを意味します。 – Shadow

+0

@Shadowコメントをいただきありがとうございます。私はこれを設計しなかった。それは宝くじの結果を保存するためのテーブルです。私はそれがどのようにして正規化され、柔軟性があるのか​​理解しようとしています。同じ質問内で複数の数字のグループを検索したい場合は、そのグループのすべてのグループをチェックすることができます。 –

+0

@ Shadow私は、これらの数値データを別々のテーブルに分割し、各抽選エントリーに1対多のアプローチを使用する必要があることを認識しています。その後、柔軟性が増し、数字に参加して順序付けを行い、すべてのパフォーマンスを向上させてより簡単なクエリを実行できるようになります。 –

答えて

2

あなたのクエリは、のように簡略化することができます:いいえ、それはあまりにもパフォーマンスの高いソリューションではありません

SELECT * 
FROM numbers 
WHERE 
7 IN (n1, n2, n3, n4, n5, n6) AND 
16 IN (n1, n2, n3, n4, n5, n6) AND 
18 IN (n1, n2, n3, n4, n5, n6) AND 
22 IN (n1, n2, n3, n4, n5, n6) AND 
23 IN (n1, n2, n3, n4, n5, n6) AND 
43 IN (n1, n2, n3, n4, n5, n6) ; 
+0

S 'euxaristo Giorgo!簡単にしていただきありがとうございます。時には私の頭がこもってしまい、私はこれらの単純なことを考えることができません。おそらく別のテーブルに数値を分割することは、ここでパフォーマンスを向上させ、より美しいものにするための最良のケースです。私が他の回答を得られなければ受け入れます。 +1 –

+0

@ChristosLytras Parakalo Christo!私はテーブルを正規化することが最善の選択であることに同意します。 –

関連する問題