我正在构建一个简单的网站,让我的工作人员可以使用Jquery可拖动脚本轻松地将员工姓名与他们的宝贝图片相匹配。
我有两张桌子(USERS和ENTRIES)。有一个名为PEOPLE的第3个表,但它对这个问题并不重要。
在条目中," 0"的用户ID有正确的顺序(即personid 1应该是第4个.adidid 2应该是第3个,等等。再次,personid来自另一个名为PEOPLE的表,这对于这个问题不重要。)
+----------+---------+--------------+
| userid |firstname| lastname
+----------+---------+--------------+
| 1 | Bob | Wilson |
| 2 | Charlie | Jackson |
| 3 | Jim | Smith |
| 4 | Doug | Jones |
+----------+---------+--------------+
+----------+---------+--------------+
| userid | personid| ordering
+----------+---------+--------------+
| 0 | 1 | 4 |
| 0 | 2 | 3 |
| 0 | 3 | 1 |
| 0 | 4 | 2 |
| 1 | 1 | 2 |
| 1 | 2 | 4 |
| 1 | 3 | 1 |
| 1 | 4 | 3 |
| 2 | 1 | 1 |
| 2 | 2 | 3 |
| 2 | 3 | 4 |
| 2 | 4 | 2 |
+----------+---------+--------------+
我实际上可能有100个用户在条目表中有条目。每个用户将有100个人员订购。我想要做的是,以最有效,最合理的方式循环所有条目,并将每个条目与CORRECT答案(即用户ID 0)进行比较。
所以我的想法可能是获取数组中的所有条目,然后将userid 1的数组与userid 0的数组进行比较。然后将userid2的数组与userid 0的数组进行比较。依此类推。
我只是想比较每个后续用户有多少正确答案。所以在我的示例表中,userid 1有一个正确的答案(Personid 3与排序1匹配),userid 2有两个正确答案(personid 2匹配订购3,personid 4匹配订购2)。
我第一次这样做......
$sql = "SELECT * FROM entries";
$getpeople = mysqli_query($connection, $sql);
if (!$getpeople) {
die("Database query failed: " . mysqli_error($connection));
} else {
while ($row = mysqli_fetch_array($getpeople)) {
$entriesarray[$row['userid']][$row['personid']]=$row['ordering'];
}
}
这会给我一些包含所有用户条目的数组。
然后我做了这个测试......
$result_array = array_intersect_assoc($entriesarray[1], $entriesarray[0]);
print_r($result_array);
echo "COUNTRIGHT=".count($result_array);
这基本上是通过给我'#34; 1"的国度来做我想要的。它会看到数组中有多少用户ID与用户ID 0的数组中的值AND键匹配(同样,正确的答案数组)。
但是现在我很难知道如何在一个好的循环中有效地做到这一点,而不是一个接一个地去做。同样,我可能有100个用户循环。我在质疑我上面的初始mySQL查询是否正确或应该采用不同的方式。
最终,我想列出所有用户的姓名,姓氏和他们正确的号码。并按他们正确的数字命令他们DESC。从本质上讲,它是一个看起来像......的排行榜。
Jim Smith 2
Charlie Wilson 1
and so on (but on a much greater scale where the person in first place will probably have around 80 or 90 correct).
因为我想在"排行榜"上显示名字,我知道我需要在这里的某个地方加入来从USERS表中获取该信息,所以它让我的小脑更加复杂: )
我希望这对某人有意义。如果有人能指出我正确的方向,那将是太棒了。我失去理智,在一天结束时可能相当简单。
谢谢!
答案 0 :(得分:0)
通过左边加入用户0
并计算每个人的订购匹配数,下面的查询将为您提供每个用户的正确条目计数
select t1.userid, count(t2.*)
from entries t1
left join entries t2 on t2.userid = 0
and t2.personid = t1.personid
and t2.ordering = t1.ordering
group by t1.userid
如果您需要用户表中的名称,可以加入
select u.*, count(t2.*)
from entries t1
join users u on u.userid = t1.userid
left join entries t2 on t2.userid = 0
and t2.personid = t1.personid
and t2.ordering = t1.ordering
group by u.userid
答案 1 :(得分:0)
你走在正确的轨道上。在循环中比较$entriesarray
中的所有用户并不会比您已经完成的复杂得多。
首先,将用户0从$entriesarray
转移,以获得匹配的正确设置。然后你可以迭代其余的条目数组,计算正确的匹配,如此...
$correctSet = $entriesarray[0];
unset($entriesarray[0]); // we don't want to check this against itself
$leaderBoard = []; // initialize an empty leaderboard array
foreach($entriesarray as $userId => $entries) {
$correctMatches = count(array_intersect_assoc($entries, $correctSet));
$leaderBoard[$userId] = $correctMatches;
}
就在SQL中这样做,也可以通过对user_id 0进行JOIN,如上所述(所以我不打扰重复)。用户信息也可以单独获取并由user_id查找,因为您已在此方法中的$leaderboard
数组中获得了该信息。