将 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 区分开来的主要内容,如果未能解决你的问题,请参考以下文章

删除Foreach循环中的重复项

使用java 8中的forEach(..)而不是java 5中的forEach循环的任何优势[重复]

解释php中的foreach循环[重复]

forEach函数中的while循环[重复]

转到 JavaScript forEach 循环中的“下一个”迭代 [重复]

如何正确调用 Parallel.ForEach 循环中的调用异步方法[重复]