首页 > 解决方案 > 如何过滤与服务相关的活动

问题描述

数据库中的服务

数据库中的活动

服务活动的映射

PHP

<?php include("connect.php");?>
<?php 
    $activityoneid = "select activity.activity_name,activity.activity_id 
                      from activity 
                      join serviceactivitymap on activity.activity_id = serviceactivitymap.activity_id";

    $activityonevalue = $conn->query($activityoneid) or die ($conn>error.__LINE__);
    $activitiesone = [];

    while ($row = $activityonevalue->fetch_assoc()) {
        $activitiesone[] = $row;
    }

    //for services
    $service = "select * from service";
    $servicevalue = $conn->query($service) or die ($conn>error.__LINE__);
    $services = [];

    while ($row = $servicevalue->fetch_assoc()) {
        $services[] = $row;
    }

    foreach($services as $serve)
    {
?> 
        <input type = "checkbox" name = "service" value="<?php echo $serve['service_id']?>">
        <?php echo $serve['service_name']?>
        <br>
        <?php foreach($activitiesone as $activiti)
            {
        ?>
            <input type = "checkbox" name = "activity" value = "<?php echo $activiti['activity_id']?>">
            <?php echo $activiti['activity_name'];?>
        <?php 
            } 
        ?>
        <br>
    <?php 
    }?>

这是我的显示服务和活动代码##最近的输出##:-所有服务都显示相同的活动,我可以使用 service_id 过滤数据意味着显示与服务 id 相关的活动,如果服务 id = 1 则仅显示与 1 相关的活动不其他

最近的输出:

预期输出:-

见映射第三个映射表,我将显示映射表的输出

谢谢

标签: phpmysql

解决方案


使用您的示例数据,我想出了一个更简单的解决方案。您的代码试图分两步完成数据库可以为您做的事情。

您的第一个查询获取服务。然后列出每个相关的活动,一个服务一个服务。这种方法虽然有效,但会导致数据库被访问两次。数据库可以使用 SQL 为您执行此操作。

这是查询:

SELECT s.service_name,     
       a.activity_name
FROM service AS s
JOIN service_has_activity AS sha ON s.service_id  = sha.service_id
JOIN activity             AS a   ON a.activity_id = sha.activity_id
ORDER BY s.service_name, a.activity_name

结果是:

Incometax     Return Filing
Incometax     Revised Return Filing
TDS           Statutory Audit
TDS           Tax Payment

service此查询使用 JOIN 将、activityservice_has_activity表“链接”在一起。然后使用 ORDER BY 对数据进行排序。

如果要根据特定条件进行过滤,可以WHERE在查询中添加子句。前任。如果您只想查看特定服务的数据,请在以下行之前添加此ORDER BY行:

WHERE s.service_name = 'IncomeTax'

然后你可以在这些结果上编写一个循环来处理显示。如果可以的话,让数据库做这些总是更有效,并且只做 PHP 代码中的显示部分。

最终结果是 1 次循环(用于显示结果),1 次访问数据库(用于运行查询)。如果你有一个大数据集,它也会加快你的页面速度。


推荐阅读