我有一個表的日期與整數某些領域是這樣的:的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 |
+----+------------+----+----+----+----+----+----+----+
這工作,但我有一些關於它的工作方式有些擔憂,如果這種做法是性能當對十幾萬行使用時是明智的。
有沒有另一種更好的(或更簡單的)方式來完成這樣的事情?
不,這是不是太高性能的解決方案。但是,如果沒有規範化你的數據結構,你不會找到任何高性能的。 Sql旨在按列搜索,而不是按行搜索。 – Shadow
@Shadow感謝您的評論。我沒有設計這個;這是一張儲存彩票結果的表格。我試圖弄清楚如何以某種靈活的方式來規範化。現在,如果我想在同一個查詢中搜索多個數字組,那麼我必須編寫一些難看的字段來檢查每個組,這當然不是一個好的和高性能的解決方案。 –
@Shadow我意識到我需要將這些數字數據拆分到一個單獨的表格中,並使用一對多方法來獲取每個彩票條目。然後它將會非常靈活,我將能夠加入和訂購這些數字,並進行更簡單的查詢並獲得所有性能提升。 –