как избавиться от дубликатов через запрос?

так что это мой текущий код, который запускает оператор 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;

}

например, я печатаю все результаты для имени Джо. Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:20:07 DL: kahisds8687 Компания: aerotek

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:09:24 DL: kahisds8687 Компания: aerotek

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:07:02 DL: kahisds8687 Компания: aerotek

Имя: joe Фамилия: aef Прибытие: 24.06.2014 14:46:34 DL: jior21r3 Компания: asfsad

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:04:13 DL: kahisds8687 Компания: aerotek

вместо этого я хочу напечатать имена на основе дубликатов dl, если имена совпадают. Итак, что мне делать, чтобы настроить SQL-запрос, я пытался использовать разные, но получаю ошибки.


ОБНОВЛЕНИЕ: Итак, я ищу запрос в таблице. Я хотел бы напечатать каждого Джо, даже если имя и фамилия совпадают (или не совпадают), но исключительно на основе драйвера L #. Итак, если есть Джо Смит и Джо Джеймс, и я ищу Джо, все записи каждого (которых может быть много, потому что они могут быть входящими и исходящими) могут присутствовать. Я хотел бы просто напечатать по одному из каждого, не имеет значения, самая ранняя или самая поздняя дата прибытия, это не то, о чем я беспокоюсь. Я больше пытаюсь напечатать только один случай каждого, чтобы затем я мог продолжить свое приложение с правильным человеком. Также таким образом в настоящее время я буду печатать все дела (которых может быть тонна, если они были введены много раз, например, в прошлом месяце). поэтому я действительно хочу печатать на основе драйвера L и, конечно, относиться к поисковому запросу в зависимости от того, что ищется.

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:20:07 DL: kahisds8687 Компания: aerotek

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:09:24 DL: kahisds8687 Компания: aerotek

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:07:02 DL: kahisds8687 Компания: aerotek

Имя: joe Фамилия: aef Прибытие: 24.06.2014 14:46:34 DL: jior21r3 Компания:

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:04:13 DL: kahisds8687 Компания: aerotek

текущий оператор: $ sql = «ВЫБЕРИТЕ * ОТ подрядчика, ГДЕ СЦЕПИТЬ (ИМЯ, ' ', ФАМИЛИЯ, ' ', ПРИБЫТИЕ, ' ', ID, ' ', DRIVERL ) как '%$searchTerm%' ГРУППИРОВАТЬ ПО ДРАЙВЕРУ";

я бы хотел, чтобы в идеале было напечатано только одно из каждого человека:

Имя: joe Фамилия: aef Прибытие: 24.06.2014 14:46:34 DL: jior21r3 Компания:

Имя: calvin Фамилия: joe Прибытие: 24.06.2014 14:04:13 DL: kahisds8687 Компания: aerotek


person user3711444    schedule 25.06.2014    source источник
comment
Порядок ведения: возможность внедрения sql, и приведенный выше запрос создаст полное сканирование таблицы, поскольку вы объединяете поля вместе.   -  person Ruskin    schedule 25.06.2014
comment
Ваш код уже возвращает список отдельных записей. Если вы хотите показать Кельвина Джо только один раз, вам нужно использовать Different в начале запроса и избавиться от времени прибытия в наборе результатов.   -  person entropic    schedule 25.06.2014


Ответы (1)


Прямо сейчас 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 в качестве значения прибытия.

person Jenn    schedule 25.06.2014
comment
ценю помощь :) но у меня все еще есть проблема/проблема. поэтому я попробовал первый случай и получаю ошибки, связанные с «Предупреждение: mysql_num_rows() ожидает, что параметр 1 будет ресурсом, логическим значением, заданным в C:\wamp\www\contractor\searchpage.php в строке 69». ТАКЖЕ я пытаюсь используйте водительские права, чтобы различать двух людей с одинаковым именем или фамилией, если это то, по чему они ищут. и у меня все дела печатаются из таблицы конкретного имени, где мне действительно хотелось бы по одному от каждого конкретного человека. так что на самом деле только один кельвин джо и джо аэф. надеюсь, что это имеет смысл - person user3711444; 25.06.2014
comment
@user3711444 user3711444 Я не совсем понимаю. Можете ли вы обновить свой вопрос, чтобы включить эту проблему? Можете ли вы попробовать запрос без поступления в выборку вообще и посмотреть, получите ли вы ошибку? Итак, «Выберите разные имя, фамилию, дл, компанию из ...» - person Jenn; 25.06.2014
comment
@user3711444 user3711444 хорошо, вы пытались выполнить свой запрос, кроме как с моим выбором? «выбрать отдельное имя, фамилию, актерский состав (прибытие как дату), dl, компанию», и если это не сработало, то вы пробовали то же самое без актерского состава (прибытие как дата)? - person Jenn; 25.06.2014
comment
ни один не работает. проблема постоянно возникает, когда устанавливается идентификатор пользователя. это может быть бесконечной проблемой: / остальная часть моего кода не позволяет изменениям работать должным образом. возможно, мне придется переосмыслить код с самого начала. - person user3711444; 26.06.2014
comment
Я считаю, что проблема в том, как я использую запрос для публикации результатов. он не создан для этой точной функциональности. - person user3711444; 26.06.2014
comment
Я не понимаю проблемы. Я бы рекомендовал работать над sql и javascript отдельно. Попробуйте получить SQL-запрос, который возвращает результаты, которые вы ищете. Затем посмотрите, какие проблемы возникают. Похоже, текущая ошибка, которую вы получаете, связана с javascript? - person Jenn; 26.06.2014