簡體   English   中英

從5列表格MySQL中選擇2-3個數字組合

[英]Select 2-3 number combination from 5 column Table MySQL

表結構:

 MyTable (
   ID INT AUTO_INCREMENT,
   Num1 INT,
   Num2 INT,
   Num3 INT,
   Num4 INT,
   PRIMARY KEY(ID)
 )engine=InnoDB;

現在我大約有20-30k的記錄。 Num1, Num2, Num3Num4只是一些隨機數。 我正在嘗試從此表中選擇23 數字組合 例如,假設我在表中有以下行:

ID    Num1   Num2   Num3   Num4
1     20     11     9      150
2     30     11     20     19
3     40     45     11     20

我想選擇最常用的2個數字組合,然后選擇3個數字組合。 因此請注意,表中2011出現3次表示組合20,11 or 11,20無關緊要,順序為3的組合對於其他組合依此類推。

我想在PHP數組中檢索此數據,以便我可以進行一些計算或在屏幕上顯示。

到目前為止我嘗試過的是:

 SELECT *
 FROM MyTable
 WHERE (Num1 = :num1 AND Num2 = :num2) OR (Num1 = :num1 AND Num3 = :num2) OR 
       (Num1 = :num1 AND Num4 = :num2) OR (Num2 = :num1 AND Num1 = :num2) OR 
       (Num2 = :num1 AND Num3 = :num2) OR (Num2 = :num1 AND Num4 = :num2) OR 
       ***
       ***

對於所有組合,依此類推。 現在,如果我嘗試將其用於3個數字組合,這將變得很煩人。

  1. 有沒有更好,更有效的方法?
  2. 我是否需要重組表以使其更容易?
  3. 重組表會被規范化嗎? (現在我認為如果沒有請規范化,請告訴我)

情況2組合

我認為您應該考慮按以下大矩陣存儲信息:

num  times_appearing_with_number_1 times_appearing_with_number_2 ...

對於像這樣的情況

 1 8 2 3
 1 7 23 24

就像:

 num 1 2 3 4 5 6 ...
 1   - 1 1 0 0 0 ...
 2   1 - 1 0 0 0 ...

然后檢查哪些行編號更大。 索引對於獲取其對應的編號將很有用。

情況3組合

與3D矩陣相同。

要提供這些表,您應該只從MySQL獲取信息,然后循環。

由於值的順序無關緊要,所以只有6個排列可以從四列(c1-c2,c1-c3,c1-c4,c2-c3,c2-c4和c3-c4)中選擇兩個四個排列以選擇三個(c1-c2-c3,c1-c2-c4,c1-c3-c4,c2-c3-c4)。

一種方法是創建一個臨時表,其中包含該行的ID和這些值的所有6個(3個列為4)排列。 您可以使用如下查詢:

SELECT id, CASE Num1<=Num2 WHEN TRUE THEN CONCAT(Num1,"-",Num2) ELSE CONCAT(Num2,"-",Num1) END FROM MyTable
UNION
SELECT id, CASE Num1<=Num3 WHEN TRUE THEN CONCAT(Num1,"-",Num3) ELSE CONCAT(Num3,"-",Num1) END FROM MyTable
...

然后剩下的就是計算匹配的行數(請注意,上面的查詢可以手動運行,也可以作為計數查詢的子查詢)

編輯:要的東西撥弄用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM