如何通过查询摆脱重复?

时间:2014-06-25 15:10:31

标签: html mysql sql statements

所以这是我当前运行sql语句的代码:

   $sql= "SELECT * FROM contractor WHERE CONCAT( FIRSTNAME,' ', LASTNAME,' ', ARRIVAL,' ', ID, ' ', DRIVERL ) like '%$searchTerm%' GROUP BY DRIVERL";


        $query = mysql_query($sql);

    $count=mysql_num_rows($query);

    if(($count)>=1)
    {
    $output = "";

    while($row = mysql_fetch_array($query))


    {


            $output .= '<a  href="'.'http://localhost/contractor/redirectcontractorpage.php'.'?userid='.$row['id'].'">
     First Name: '.$row['FIRSTNAME'].'<br />
            Last Name: '.$row['LASTNAME'].'<br />
            Arrival: '.$row['ARRIVAL'].'<br />
            DL: '.$row['DRIVERL'].'<br />
            Company: '.$row['COMPANY'].'<br /><br /></a>';



  }


echo $output;

    }

    else
    echo "There was no matching record for the name " . $searchTerm;

}

例如我打印名称为joe的所有结果。 名字:calvin 姓氏:乔 到货时间:2014-06-24 14:20:07 DL:kahisds8687 公司:aerotek

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:09:24 DL:kahisds8687 公司:aerotek

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:07:02 DL:kahisds8687 公司:aerotek

名字:乔 姓氏:aef 到货时间:2014-06-24 14:46:34 DL:jior21r3 公司:asfsad

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:04:13 DL:kahisds8687 公司:aerotek

相反,我想根据重复的dl打印名称,但名称是相同的。所以我该怎么做才能调整sql查询,我尝试使用distinct但是我遇到了错误。


更新: 所以我期待在表格中查询。我想打印每一个乔,即使名字和姓氏相同(或不是),但仅仅基于driverL#。因此,如果有一个Joe Smith和一个Joe James并且我搜索了joe,那么每个的所有记录(可能很多因为它们可以进入和出去)都可以存在。我想打印其中一个,无论是最早的还是最新的到货日期,都不是我担心的。我更想尝试打印每个案例,以便我可以继续使用正确的个人申请。这种方式目前我将打印所有情况(例如,如果他们在过去一个月中多次输入,则可以是一吨)。所以我真的想基于driverL进行打印,当然还要根据搜索的内容与searchterm相关。

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:20:07 DL:kahisds8687 公司:aerotek

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:09:24 DL:kahisds8687 公司:aerotek

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:07:02 DL:kahisds8687 公司:aerotek

名字:乔 姓氏:aef 到货时间:2014-06-24 14:46:34 DL:jior21r3 公司:

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:04:13 DL:kahisds8687 公司:aerotek

当前声明:$ sql =“SELECT * FROM承包商WHERE CONCAT(FIRSTNAME,'',LASTNAME,'',ARRIVAL,'',ID,'',DRIVERL),如'%$ searchTerm%'GROUP BY DRIVERL” ;

我希望每个人中只有一个人能够如此理想地打印出来:

名字:乔 姓氏:aef 到货时间:2014-06-24 14:46:34 DL:jior21r3 公司:

名字:凯文 姓氏:乔 到货时间:2014-06-24 14:04:13 DL:kahisds8687 公司:aerotek

1 个答案:

答案 0 :(得分:0)

现在sql没有看到所有的calvin joe条目都是重复的。这是因为在不同结果之间存在至少一个不同的字段。在这种情况下,这是到达值。第一个calvin joe在到达时存储2014-06-24 14:20:07,而第二个calvin joe有2014-06-24 14:09:24。秒是不同的,sql永远不会看他们相同。有几种方法可以解决这个问题。

解决这个问题的第一种方法是时间无关紧要。然后,您可以使用

Select distinct firstname, 
                lastname, 
                cast(arrival as date), 
                dl, 
                company
From ...

这样做是告诉sql只应该使用到达的日期部分。然后,sql仅选择其中至少一个列值与包含的其他数据不同的数据点。在这种情况下,它会将所有卡尔文商业的所有到货人数转换为2014-06-24。然后calvin joe将只被选中一次。

让我们说一分钟你的数据是关于飞机的。也许你确实需要一个时间列出。在这种情况下,您需要确定如何选择该时间。也许你想要最早的时间出现,也许你想要最新的时间出现。在下一个例子中,我将展示最新的时间。

Select  firstname, 
        lastname, 
        max(arrival), 
        dl, 
        company
FROM contractor 
WHERE CONCAT( FIRSTNAME,' ', LASTNAME,' ', ARRIVAL,' ', ID, ' ', DRIVERL ) like '%$searchTerm%' 

GROUP BY firstname,
         lastname,
         dl,
         company

此查询告诉sql我们希望将具有相同名字,姓氏,dl和公司的所有数据点显示为一个数据点。然后,sql查看所有到达并选择最有时间向用户显示的到达。这称为聚合函数。此查询仅显示一次calvin joe,并将选择2014-06-24 14:20:07作为到达值。