表结构:
MyTable (
ID INT AUTO_INCREMENT,
Num1 INT,
Num2 INT,
Num3 INT,
Num4 INT,
PRIMARY KEY(ID)
)engine=InnoDB;现在我有了大约20到30k的记录。Num1, Num2, Num3和Num4只是一些随机数。我试图从这个表中选择2和3 数字组合。例如,假设表中有以下行:
ID Num1 Num2 Num3 Num4
1 20 11 9 150
2 30 11 20 19
3 40 45 11 20我希望选择最常用的2数字组合,然后选择3数字组合。所以请注意,20和11在表中出现3次数,这意味着组合20,11 or 11,20并不重要,顺序有、count、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数字组合,这会变得很烦人。
发布于 2013-03-30 22:28:54
案例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获取信息,然后循环。
发布于 2013-03-30 22:45:28
由于值的顺序并不重要,从四列中选出两个列(c1-c2、c1-c3、c1-c4、c2-c3、c2-c4和c3-c4)中只有6个排列,而选择三个列(c1-c2-c3、c1-c2-c4、c2-c3-c4)只有4个排列。
一种方法是创建一个临时表,该表包含行的id和这些值的所有6(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
...剩下的就是计数匹配的行数(请注意,上面的查询可以手动运行,也可以作为计数查询的子查询运行)
编辑:用于小提琴的东西。
https://stackoverflow.com/questions/15724142
复制相似问题