将 foreach 循环中的重复项与 sql 区分开来
Posted
技术标签:
【中文标题】将 foreach 循环中的重复项与 sql 区分开来【英文标题】:Distinguish duplicates in a foreach loop from sql 【发布时间】:2013-10-15 15:57:09 【问题描述】:您好,我正在创建一个工作申请管理系统。在后端,管理员需要能够看到所有已申请工作并等待回复的人。这是我的 sql 查询:
'SELECT * FROM jp_applications WHERE application_status = "Awaiting Response" ORDER BY job_id'
我的问题是,一旦我循环并将其输出到申请人列表中,如果它是重复申请人,我希望能够向该列表元素添加一个类。 (一个人申请一份以上的工作)。
理想情况下,我希望列表按 job_id 排序,所以我不想按 user_id 排序。
我希望这是有道理的。
<ul>
<li class="duplicate">Joe Bloggs</li>
<li>Michael Jackson</li>
<li>Gandalf the Grey</li>
<li>Mahatma Gandhi</li>
<li class="duplicate">Joe Bloggs</li>
<li>Daffy Duck</li>
<li>Sponegbob Squarepants</li>
<li>Will Smill</li>
</ul>
【问题讨论】:
你能举一个你正在寻找的输出的例子吗? 【参考方案1】:替代方案 - 让数据库为您完成工作:
SELECT j.*, c.appl_count FROM jp_applications j
INNER JOIN (SELECT user_id, count(1) as appl_count FROM jp_applications
WHERE application_status = "Awaiting Response"
GROUP BY user_id) c on c.user_id = j.user_id
WHERE j.application_status = "Awaiting Response"
ORDER BY j.job_id
然后您的结果集中将有字段“appl_count”可用,如果大于 1,则附加该类。这消除了在应用程序代码中进行任何以牙还牙记账的需要。
【讨论】:
+1 它似乎比 php 中的 foreach 更优雅。会不会比简单查询(没有 JOIN)成本高很多? 即时成功!!!太感谢了。我一半知道查询是可能的,但过去 WHERE 和 ORDER BY 我对查询不太感兴趣。再次感谢 @Sebastien,简短的回答是查询将比以前更昂贵,但是,在整个解决方案中(尤其是随着数据集变大),查询解决方案应该比做数组更有效PHP中的会计。如果不考虑很多很多因素,就没有简单的性能优化答案。 嘿@DavidF 你能给我一些帮助吗?我也有类似的问题...***.com/q/19390581/2054434 @PlayHardGoPro 我在您的问题中添加了一条评论,链接回这篇文章。我真的建议为查询创建一个视图,然后使用这张票中的方法。同样,您必须验证查询的性能是否糟糕。【参考方案2】:在每次循环迭代时,检查 user_id 键是否存在于您的“already_matched”数组中。 如果没有,请附加您的课程。否则,什么都不做
半php-ish伪代码:
$already_matched = array();
foreach($results as $result)
if(!array_key_exists($result['user_id'],$already_matched))
$already_matched[$result['user_id']] = true;
// append the css class. This is the first match
else
// This is the second and all subsequent matches
【讨论】:
【参考方案3】:您可以使用 php 数组有效地检测重复项:
$applicants = array();
// $results = query results
foreach($results as $application)
$is_duplicate = !empty($applicants[$applicants['user_id']]);
echo '<span class="' . ($is_duplicate ? 'duplicate' : '') . '">Application here</span>'=
$applicants[$application['user_id']] = $application;
我省略了所有数据库处理代码,因为您似乎已经控制了它。关键是在一个由用户 id 索引的数组中创建一个条目,然后在每次迭代时检查它是否已经循环过该用户。
【讨论】:
以上是关于将 foreach 循环中的重复项与 sql 区分开来的主要内容,如果未能解决你的问题,请参考以下文章
使用java 8中的forEach(..)而不是java 5中的forEach循环的任何优势[重复]