2017-08-27 21 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 | 
+----+------------+----+----+----+----+----+----+----+ 

這工作,但我有一些關於它的工作方式有些擔憂,如果這種做法是性能當對十幾萬行使用時是明智的。

有沒有另一種更好的(或更簡單的)方式來完成這樣的事情?

+0

不,這是不是太高性能的解決方案。但是,如果沒有規範化你的數據結構,你不會找到任何高性能的。 Sql旨在按列搜索,而不是按行搜索。 – Shadow

+0

@Shadow感謝您的評論。我沒有設計這個;這是一張儲存彩票結果的表格。我試圖弄清楚如何以某種靈活的方式來規範化。現在,如果我想在同一個查詢中搜索多個數字組,那麼我必須編寫一些難看的字段來檢查每個組,這當然不是一個好的和高性能的解決方案。 –

+0

@Shadow我意識到我需要將這些數字數據拆分到一個單獨的表格中,並使用一對多方法來獲取每個彩票條目。然後它將會非常靈活,我將能夠加入和訂購這些數字,並進行更簡單的查詢並獲得所有性能提升。 –

回答

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!我同意正常化桌子是你最好的選擇。 –