【问题标题】:how to get rid of duplicates through query?如何通过查询摆脱重复?
【发布时间】:2014-06-26 02:28:15
【问题描述】:

这是我当前运行 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 的所有结果。 名字:卡尔文 姓名:乔 到货时间: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,但我得到了错误。


更新: 所以我想在表中查询。我想打印每个 joe,即使名字和姓氏相同(或不是)但仅基于 driverL #。因此,如果有一个 Joe Smith 和一个 Joe James,我搜索 joe,每个人的所有记录(可能很多,因为它们可以传入和传出)都可以存在。我只想打印一个,不管它是最早还是最晚到达日期,这不是我担心的。我更倾向于只打印一个案例,这样我就可以继续使用正确的个人申请。也是这种方式,目前我将打印所有案例(例如,如果它们在过去一个月内多次输入,则可能是一吨)。所以我真的想基于 driverL 打印,当然取决于搜索的内容与搜索词相关。

名字:卡尔文 姓名:乔 到货时间: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 contract WHERE CONCAT(FIRSTNAME,' ', LASTNAME,' ', ARRIVAL, ' ', ID, ' ', DRIVRL ) like '%$searchTerm%' GROUP BY DRIVERL" ;

我希望每个人只打印一个,非常理想:

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

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

【问题讨论】:

  • 程序点:可能存在 sql 注入,并且当您将字段连接在一起时,上面的查询将创建全表扫描。
  • 您的代码已经返回了不同条目的列表。如果您只想显示“Calvin Joe”一次 - 那么您需要在查询的前面使用 distinct,并去掉结果集中的到达时间。

标签: html mysql sql statements


【解决方案1】:

现在 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 仅选择其中至少一个列值与包含的其他数据不同的数据点。在这种情况下,它将所有 calvin joes 的所有到达转换为 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 作为到达值。

【讨论】:

  • 感谢您的帮助 :) 但我仍然有问题/担忧。所以我尝试了第一种情况,我遇到了处理“警告:mysql_num_rows() 期望参数 1 是资源,在第 69 行的 C:\wamp\www\contractor\searchpage.php 中给出的布尔值”的错误如果那是他们搜索的内容,请使用驾驶执照来区分具有相同名字或姓氏的两个人。我有从特定名称的表格中打印的所有案例,我真的希望每个特定的人都有一个。所以真的只有一个 calvin joe 和 joe aef.hope 这是有道理的
  • @user3711444 我不太明白。您可以更新您的问题以包含此问题吗?你可以在没有到达选择的情况下尝试查询,看看你是否得到错误?所以'从...中选择不同的名字、姓氏、dl、公司'
  • @user3711444 好的,除了我的选择之外,您是否尝试运行查询? 'select distinct firstname, lastname, cast(arrival as date), dl, company' 如果这不起作用,那么你是否在没有 cast(arrival as date) 的情况下尝试了同样的事情?
  • 两者都不起作用。在为用户设置 id 的地方,这个问题不断上升。这可能是一个永无止境的问题:/我的其余代码没有让更改正常工作。我可能不得不从头重新考虑代码。
  • 我认为问题在于我如何使用查询来发布结果。它不是为这个确切的功能而构建的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多