如何比较2个表并创建新表并每天更新

问题描述 投票:1回答:3
table1

----------------|------------------|-------------------|-------------------|
|      email          |     selection1   | selection2        |     selection3
|                                                           
|---------------------|------------------|-------------------|-------------------|
|  [email protected]      |        4       |           7                     9
|---------------------|------------------|-------------------|------------------|
|[email protected]                2                     9                6
---------------------|------------------|--------------------|-------------------|      

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

所以,我有两个桌子。一种基于用户输入,为获胜者的数量选择3场比赛。

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

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

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

我尝试过INNER JOIN,但是组合太多。我是PHP和SQL的新手,所以我真的不知道采用哪种方法。

php mysql database join denormalization
3个回答
1
投票

您可以将值从数据库中拉出,然后遍历每个用户并将其提交的内容与第二个表中的结果进行比较。像this这样的东西应该能够帮助您进行第一部分(将数据从MySQL中拉出并放入数组中)。

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

<?
//Loop through each of the users in the $users array
foreach($users as $user)
{
    if($user['selection1'] == $results['race1'])
    {
        //Add to their points or whatever you would like to do
    }

    if($user['selection2'] == $results['race2'])
    {
        //Add to their points or whatever you would like to do
    }

    if($user['selection3'] == $results['race3'])
    {
        //Add to their points or whatever you would like to do
    }
}

?>

然而,您可能要考虑重新组织数据库结构。因为这不是很灵活,如果您想在将来进行更改。同样,您提供的示例在第一个表中有3个种族,在第二个表中有4个种族。


1
投票

[您的首要任务是创建一个子查询,该子查询以电子邮件,选择的形式提供您的table1。看起来像这样(https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/0

             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

[下一步,对您的桌子做同样的事情。 (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/1

             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;

然后,您需要找出多少个race值与每个selection值匹配。这需要一个聚合函数。您的查询的概要是

   SELECT email, COUNT(race) races_chosen
     FROM selections
     JOIN races ON selections.selection = races.race
    GROUP BY email

这里,通过JOIN操作,您正在创建一个结果集,该结果集显示每封电子邮件以及也在比赛中出现的选择。然后,您要数它们。

此处的实际查询需要使用您的子查询。看起来像这样。 (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/2

   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行更改为该行以获取积分。 (https://www.db-fiddle.com/f/mbXAqAo6Y4MPd3jH9vAY4Q/3

   SELECT email, COUNT(race) races_chosen, COUNT(races)*50 points

几件事供您考虑。

  1. 不要创建另一个表来包含此结果数据。而是,在需要时使用查询生成它。这样比较容易,因为您不必弄清楚更改了什么来更新您的额外表。您可以即时生成结果。 SQL是针对这种操作而创建的。

  2. 我给您使用的子查询起到了获取denormalized表并将其标准化的作用。如果不对它们进行规范化,则生成结果的查询将更加复杂。您的表被非规范化,因为它们在每一行上都包含多个事实。

这是我的意思。您的table2使用一行来显示四个不同的种族。相反,每场比赛您应该排成一行。然后,使用INSERT将另一个种族添加到表中,或使用DELETE删除一个种族,则要容易得多。这也使查询更容易。

您的table1已被规范化,因为这是一种执行规则的方法,即每个电子邮件地址最多可以包含3个种族。这是一个可以容忍的软件设计决定。但是,如果您想让他们将来加入第四场比赛,则更难解决您的应用程序。


-1
投票

[请尝试使用'id'列,其中为'auto_increment'。然后,您可以识别所有用户,等等。

我会开发一个更清晰的sql表,以便每个人都可以理解。

© www.soinside.com 2019 - 2024. All rights reserved.