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的新手,所以我真的不知道采用哪种方法。
您可以将值从数据库中拉出,然后遍历每个用户并将其提交的内容与第二个表中的结果进行比较。像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个种族。
[您的首要任务是创建一个子查询,该子查询以电子邮件,选择的形式提供您的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
几件事供您考虑。
不要创建另一个表来包含此结果数据。而是,在需要时使用查询生成它。这样比较容易,因为您不必弄清楚更改了什么来更新您的额外表。您可以即时生成结果。 SQL是针对这种操作而创建的。
我给您使用的子查询起到了获取denormalized表并将其标准化的作用。如果不对它们进行规范化,则生成结果的查询将更加复杂。您的表被非规范化,因为它们在每一行上都包含多个事实。
这是我的意思。您的table2使用一行来显示四个不同的种族。相反,每场比赛您应该排成一行。然后,使用INSERT将另一个种族添加到表中,或使用DELETE删除一个种族,则要容易得多。这也使查询更容易。
您的table1
已被规范化,因为这是一种执行规则的方法,即每个电子邮件地址最多可以包含3个种族。这是一个可以容忍的软件设计决定。但是,如果您想让他们将来加入第四场比赛,则更难解决您的应用程序。
[请尝试使用'id'列,其中为'auto_increment'。然后,您可以识别所有用户,等等。
我会开发一个更清晰的sql表,以便每个人都可以理解。