【问题标题】:PHP Distinct EquivalentPHP 不同的等价物
【发布时间】:2013-11-04 20:34:31
【问题描述】:

我知道,如果您可以像这样在 SQL 查询中使用 distinct:

SELECT DISTINCT column_name FROM table_name;

为了提取所有唯一匹配的数据,使其不会在循环中一遍又一遍地复制。我有一个难题,我有一个使用 Joins 的 SELECT 语句;一切都很好。从我创建的那个循环中,有一个 IF 和 Else 语句。如果数据落在某个日期范围内,则显示相关数据。但是,如果它不在日期范围内,那么我只想显示一些数据。

问题在于 else 语句的目的是在数据库的每一行中每次重复数据时复制数据。现在我真的不想使用两个单独的查询,所以我想看看过去是否有人有过这方面的经验,以及他们做了什么来解决这个问题。

对于那些不明白我在做什么的人,我将包含代码:

    // Database query
    $db_query = mysqli_query($con,$db_data_query);
while($db_result = mysqli_fetch_array($db_query)) {

     // Convert to proper datetime format
    $dt_vdate = new DateTime($view_date);
    $convert_vdate = $dt_vdate->format('Y-m-d H:i:s');

    // Check if the date is within the date range
    if (( $convert_vdate >= $db_result['start'] ) && ( $convert_vdate <= $db_result['finish'] )) {

    // Display Jobs within Range
    echo '
    <div class="db_col">
        <div class="person">'.  $db_result['name'] . ' #' . $db_result['id'] .'</div>
        <div class="location">'. $db_result['location'] .'</div>
        <div class="task">' . $db_result['task'] . '</div>
    </div>';
    }
    // Display blank tasks
    else if (**( $db_result['start'] == "" ) && ( $db_result['finish'] == "" )**){

        // Display Jobs within Range
    echo '
    <div class="db_col">
        <div class="person">'.  $db_result['name'] . ' #' . $db_result['id'] .'</div>
        <div class="location">'. $db_result['location'] .'</div>
        <div class="task">&nbsp;</div>
    </div>';        
    }

我把 ** 放在 elseif 条件旁边。我有一种有趣的感觉,我需要把它分成两个查询,但为了让生活更轻松,我在想是否有办法基本上检查这个人在日期范围内是否有分配的任务,然后显示这个人的名字,id # 和分配的任务。如果他们没有分配任务,则改为(使用 else if)只显示他们的姓名、id # 和一个空白 div。

这样可以打印出这个页面,并且可以手动将任务写在以后可以手写的页面上。

正在发生的问题是数据库很好地显示了分配的人员和任务。但是,如果他们没有被分配任务,那么对于他们过去每次分配任务时,都会为每个数据库条目显示人员及其 ID # 和空白 div。因此,我试图集思广益,如果没有为该人分配任务,则 else if 显示该人、ID、任务一次(而不是多次)。

【问题讨论】:

  • 我假设您的 select distinct 没有做您想做的事情,因为“任务”列每次都不同。

标签: php mysql distinct


【解决方案1】:

鉴于我上面的评论是正确的,您可以通过将人员的“id”值存储在数组中并使用 in_array 进行检查来解决问题:

:
:
$got_ids=array();
while (...)
{
  $testid=$db_result['id'];
  if (in_array($testid,$got_ids)) continue;
  :
  :
  $got_ids[]=$testid;
} // end while

应该解决问题

【讨论】:

  • 我很快就会试一试,只是快速完成一些事情。但是,是的,您对不断变化的任务的评论是正确的。这就是为什么这让我难以理解的原因。
  • 好吧,它可以工作了......所以现在它完美地显示了所有内容但是它没有像它应该显示的那样显示任何新生成的任务。我会继续摆弄它。
  • 尝试将 if(in_array(... 放在 else if 子句中。
  • 好吧,我发现了一个问题,不确定你是否会看到这个,但你给我的这个修改非常适合显示我想要的名称和 ID。但是,当一项任务分配给个人时,它会显示相同的名称和 ID 两次(一次是任​​务,一次是空白条目)。我尝试使用 else if 来限制它,所以如果没有任务但没有运气,它只会以空白条目开始循环。我试图检测哪个 $db_result['task'] 有内容,然后使用 array_diff 和/或 unset 再次从数组中消除这些内容,但没有运气。有什么想法吗?
  • OK - 这是一个想法:尝试使用 coalesce 函数将空开始转换为某个固定的早期日期,然后按开始降序排序。这样,您将首先完成所有分配的任务。然后,如果 if(in_array... 位于 then else if( 的开头,则如果该人存在任何已分配的任务,它将永远不会选择未分配的任务。您还应该为每个人获取所有已分配的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2013-05-25
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多