Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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 如何比较两个表并创建新表并每日更新_Php_Mysql_Database_Join_Denormalization - Fatal编程技术网

Php 如何比较两个表并创建新表并每日更新

Php 如何比较两个表并创建新表并每日更新,php,mysql,database,join,denormalization,Php,Mysql,Database,Join,Denormalization,所以,我有两张桌子。 一种是根据用户输入选择3场比赛作为获胜者的数量 第二张表是比赛获胜者的人数 我想比较这两个表并创建第三个表。如果此人的选择与获胜的比赛相匹配,那么他们将获得50分。因此,第三个表将显示“电子邮件”和“点数” 这将持续4天,因此,如果同一封电子邮件与另一位比赛获胜者匹配,他们将额外获得50分 我尝试过内部连接,但是组合太多了。我不熟悉PHP和SQL,所以我真的不知道该采取什么方法。您可以从数据库中提取值,然后循环遍历每个用户,并将他们提交的内容与第二个表中的结果进行比较。类似

所以,我有两张桌子。 一种是根据用户输入选择3场比赛作为获胜者的数量

第二张表是比赛获胜者的人数

我想比较这两个表并创建第三个表。如果此人的选择与获胜的比赛相匹配,那么他们将获得50分。因此,第三个表将显示“电子邮件”和“点数”

这将持续4天,因此,如果同一封电子邮件与另一位比赛获胜者匹配,他们将额外获得50分


我尝试过内部连接,但是组合太多了。我不熟悉PHP和SQL,所以我真的不知道该采取什么方法。

您可以从数据库中提取值,然后循环遍历每个用户,并将他们提交的内容与第二个表中的结果进行比较。类似的东西应该能够帮助您完成第一部分(将数据从MySQL中提取出来并放入阵列)

然后让我们假设,在将他们从数据库中取出后,您有一个包含所有用户及其提交内容的$users数组,然后是一个包含每场比赛优胜者的$results数组(表2的内容)。然后,您可以使用for循环或foreach遍历每个用户,并将他们的每个选择与结果进行比较。例如,类似这样的事情:

table1

----------------|------------------|-------------------|-------------------|
|      email          |     selection1   | selection2        |     selection3
|                                                           
|---------------------|------------------|-------------------|-------------------|
|  test@test.com      |        4       |           7                     9
|---------------------|------------------|-------------------|------------------|
|test2@test.com                2                     9                6
---------------------|------------------|--------------------|-------------------|      

table2
|---------------------|------------------|-------------------|-------------------|
|      race1|                 race2      |         race3     |       race4
|                                                           
|---------------------|------------------|-------------------|-------------------|
|  5                   |        7       |           9                    2
|---------------------|------------------|-------------------|------------------|


尽管如此,您可能希望重新组织数据库结构。事实上,如果你想在将来改变事情,这不是很灵活。另外,您提供的示例在第一个表中有3个种族,但在第二个表中有4个种族。

您的第一个任务是创建一个子查询,以电子邮件、选择的形式传递您的
表1
。看起来是这样的()

接下来,对您的表2执行同样的操作。()

然后,您需要计算出有多少
race
值与每个
选择匹配。这需要一个聚合函数。您的查询的概要如下所示

             SELECT race1 AS race from table2
             UNION ALL
             SELECT race2 AS race from table2
             UNION ALL
             SELECT race3 AS race from table2
             UNION ALL
             SELECT race4 AS race from table2;
在这里,通过JOIN操作,您将创建一个结果集,显示每封电子邮件以及在比赛中出现的选择。那你就要数了

这里的实际查询需要使用子查询。看起来像这样。()

最后,您可以将选择行更改为该行以获取您的积分。()

有两件事要你考虑。< /P>
  • 不要创建另一个表来包含此结果数据。相反,在需要时使用查询生成它。这更容易,因为你不必弄清楚是什么改变了你的额外表;您只需动态生成结果。SQL就是为这种操作而设计的

  • 我提供给您使用的子查询具有获取表并对其进行规范化的效果。如果不进行非规范化,生成结果的查询将更加复杂。您的表是非规范化的,因为它们每行包含多个事实

  • 这就是我的意思。您的表2使用一行显示四种不同的种族。相反,你应该在每场比赛中有一排。然后,使用INSERT将另一个竞争添加到表中,或使用DELETE将另一个竞争删除,都会更容易。它还使查询更容易


    您的
    表1
    是非规范化的,因为这是一种强制执行您的规则的方法,即每个电子邮件地址最多可以选择三个种族。这是一个可以容忍的软件设计决策。但是,如果你想让他们在未来增加第四场比赛,那么修复你的应用程序会变得更加困难

    您应该规范化表,因为这个数据库结构太乱了。如果你需要50场比赛,你会改变第二张桌子的结构吗?用户选择与这些比赛是如何对应的,比如:
    table1
    中的
    selection1=2
    ,但在
    table2
    中,您有
    race4=2
    ,这意味着用户赢了还是没赢?基本上,最上面的表格是用户输入,所以他们给出了自己的电子邮件地址,然后选择3场比赛(只有3场). 表2是每场比赛的结果。所以如果种族1=1,用户选择1=1。他们得到50分。如果第2场比赛与他们的选择相匹配,他们将再次获得50分。希望这更有意义
                 SELECT email, selection1 AS selection FROM table1
                 UNION ALL
                 SELECT email, selection2 AS selection FROM table1
                 UNION ALL
                 SELECT email, selection3 AS selection FROM table1
    
                 SELECT race1 AS race from table2
                 UNION ALL
                 SELECT race2 AS race from table2
                 UNION ALL
                 SELECT race3 AS race from table2
                 UNION ALL
                 SELECT race4 AS race from table2;
    
       SELECT email, COUNT(race) races_chosen
         FROM selections
         JOIN races ON selections.selection = races.race
        GROUP BY email
    
       SELECT email, COUNT(race) races_chosen
         FROM (
                 SELECT email, selection1 AS selection FROM table1
                 UNION ALL
                 SELECT email, selection2 AS selection FROM table1
                 UNION ALL
                 SELECT email, selection3 AS selection FROM table1
    
              ) selections
         JOIN (
                 SELECT race1 AS race from table2
                 UNION ALL
                 SELECT race2 AS race from table2
                 UNION ALL
                 SELECT race3 AS race from table2
                 UNION ALL
                 SELECT race4 AS race from table2
              ) AS races ON selections.selection = races.race
        GROUP BY email
    
       SELECT email, COUNT(race) races_chosen, COUNT(races)*50 points