異なる順序で列の値に値のセットを一致: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=1
とID=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ついい(かもっと簡単な)方法がありますか?
。しかし、あなたのデータ構造を正規化することなく、あなたはパフォーマンスの良いものを見つけるつもりはありません。 Sqlは列ではなく行で検索することを意味します。 – Shadow
@Shadowコメントをいただきありがとうございます。私はこれを設計しなかった。それは宝くじの結果を保存するためのテーブルです。私はそれがどのようにして正規化され、柔軟性があるのか理解しようとしています。同じ質問内で複数の数字のグループを検索したい場合は、そのグループのすべてのグループをチェックすることができます。 –
@ Shadow私は、これらの数値データを別々のテーブルに分割し、各抽選エントリーに1対多のアプローチを使用する必要があることを認識しています。その後、柔軟性が増し、数字に参加して順序付けを行い、すべてのパフォーマンスを向上させてより簡単なクエリを実行できるようになります。 –