Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从5列表中选择2-3个数字组合_Php_Mysql_Normalization - Fatal编程技术网

Php 从5列表中选择2-3个数字组合

Php 从5列表中选择2-3个数字组合,php,mysql,normalization,Php,Mysql,Normalization,表结构: 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

表结构:

 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数字组合。因此请注意,2011在表中出现3次表示组合
20,11或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数字组合,这会变得很烦人

  • 有没有更好、更有效的方法
  • 我是否需要重新构造表以简化此操作
  • 重组后的表会被规范化吗?(现在我认为是正常的,如果不是请告诉我)

  • 案例2组合

    我认为你应该在这样的大矩阵中考虑商店信息:

    num  times_appearing_with_number_1 times_appearing_with_number_2 ...
    
    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
    ...
    
    像这样的情况

     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(4表示三个列)排列。您可以使用如下查询:

    num  times_appearing_with_number_1 times_appearing_with_number_2 ...
    
    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
    ...
    

    选择id,CASE num1,那么您建议将所有数据从MySQL获取到PHP中,然后用PHP完成所有工作?是的。事实上,我的答案是基于你的一句话,我想在PHP数组中检索这些数据,这样我就可以做一些计算或在屏幕上显示。是的,问题是从一个ajax调用中检索2个num组合,从另一个ajax调用中检索3个num组合。为每个ajax调用构建矩阵有点多余,不是吗?代码片段只显示了您需要执行的六个查询中的两个,其他查询仅在本文中提到。