2014-06-25 75 views
0

所以这是它运行的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; 

} 

例如我打印所有的名乔的结果。 名字:卡尔文 姓:乔 到达:2014年6月24日14点20分07秒 DL:kahisds8687 公司:aerotek

名字:卡尔文 姓:乔 到达:2014-06 -24 14时09分24秒 DL:kahisds8687 公司:aerotek

名字:卡尔文 姓:乔 到达:2014年6月24日14时07分02秒 DL:kahisds8687 公司:aerotek

名字:Joe 姓:AEF 到达:2014年6月24日14点46分34秒 DL:jior21r3 公司:asfsad

名字:卡尔文 姓:乔 到达时间:2014年-06-24 14时04分13秒 DL:kahisds8687 公司:aerotek

,而不是我要打印基于重复的DL的柜面的名称是相同的名称。所以我应该怎么做来调整sql查询,我试着使用不同的,但我得到的错误。


UPDATE: 因此,我期待在表中查询。我想打印每一个joe,即使名字和姓氏是相同的(或者不是),但仅仅基于driverL#。所以如果有一个Joe Smith和一个Joe James并且我搜索了joe,那么每个记录(可能很多,因为它们可以是传入和传出)都可以存在。我想打印其中每一个,如果它的最早或最晚到达日期无关紧要,那不是我担心的。我更倾向于只打印每个案例,这样我就可以继续在我的应用程序中使用正确的个人。也是这样,目前我会打印所有的案件(如果他们在过去一个月内多次进入例如可能是一吨)。所以我真的想要基于driverL进行打印,当然也要根据搜索内容与searchterm相关联。

名字:卡尔文 姓:乔 到达:2014年6月24日14时20分07秒 DL:kahisds8687 公司:aerotek

名字:卡尔文 姓:乔 到达: 2014年6月24日14时09分24秒 DL:kahisds8687 公司:aerotek

名字:卡尔文 姓:乔 到达:2014年6月24日14时07分02秒 DL:kahisds8687 公司:aerotek

名字:Joe 姓:AEF 到达:2014年6月24日14点46分34秒 DL:jior21r3 公司:

名字:卡尔文 姓:乔 到达:2014年6月24日14点04分13秒 DL:kahisds8687 公司:aerotek

当前语句:$ SQL =“SELECT * FROM承包商WHERE CONCAT(名字, ' '姓氏,'',到货,'',ID,'',DRIVERL)如'%$ searchTerm%'GROUP BY DRIV ERL“;

我想只是每个人的一个被如此理想的印刷:

名字:Joe 姓:AEF 到达:2014年6月24日14时46分34秒 DL:jior21r3 公司:

名字:卡尔文 姓:乔 到达:2014年6月24日14点04分13秒 DL:kahisds8687 公司:aerotek

+0

程序的问题:潜在的SQL注入和上面的查询将创建全表扫描,因为你是连接在一起的领域。 – Ruskin

+1

您的代码已经返回不同条目的列表。如果您只想显示一次“Calvin Joe” - 那么您需要在查询前面使用不同的字词,并在结果集中排除到达时间。 – entropic

回答

0

眼下SQL没有看到所有的calvin joe条目都是重复的。这是因为不同结果之间至少有一个字段不同。在这种情况下,这就是到货价值。第一个卡尔文乔有2014-06-24 14:20:07作为抵达存储,而第二个卡尔文乔有2014-06-24 14:09:24。秒是不同的,SQL永远不会看到他们一样。有几种方法来解决这个问题。

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

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

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

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

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作为抵达值。

+0

感谢帮助:)但我仍然有一个问题/关注。所以我尝试了第一种情况,我得到的错误处理'警告:mysql_num_rows()期望参数1是资源,在69行上的C:\ wamp \ www \ contractor \ searchpage.php中给出的布尔值'我也试图使用驾驶执照来区分具有相同名字或姓氏的两个人,如果他们搜索的是这样的话。而且我还有从特定名字的表格打印的所有案例,我真的很喜欢每个特定的人。所以真的只有一个卡尔文乔和joe aef.hope有道理 – user3711444

+0

@ user3711444我不太明白。你能否更新你的问题来包含这个问题? 你可以尝试没有到达选择的查询,看看你是否得到错误?所以'选择不同的名字,姓氏,DL,公司从...' – Jenn

+0

刚刚更新下面的初始问题 – user3711444