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

така че това е текущият ми код, който изпълнява 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="/bg'.'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 Фамилия: joe Пристигане: 2014-06-24 14:20:07 DL: kahisds8687 Компания: aerotek

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:09:24 DL: kahisds8687 Компания: aerotek

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:07:02 DL: kahisds8687 Компания: aerotek

Първо име: joe Фамилия: aef Пристигане: 2014-06-24 14:46:34 DL: jior21r3 Компания: asfsad

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:04:13 DL: kahisds8687 Компания: aerotek

вместо това искам да отпечатам имената въз основа на дублираните dl, в случай че имената са еднакви. така че какво трябва да направя, за да променя sql заявката, опитах да използвам distinct, но получавам грешки.


АКТУАЛИЗАЦИЯ: Така че търся заявка в таблица. Бих искал да отпечатам всяко име, дори ако името и фамилията са еднакви (или не са), но само въз основа на driverL #. Така че, ако има Джо Смит и Джо Джеймс и аз търсим Джо, всички записи на всеки (които могат да бъдат много, защото могат да бъдат входящи и изходящи) могат да присъстват. Бих искал просто да отпечатам по един от всеки, няма значение дали е най-ранната или най-късната дата на пристигане, не това ме притеснява. По-скоро се опитвам да отпечатам само по един случай от всеки, за да мога след това да продължа в молбата си с правилното лице. също по този начин в момента бих отпечатал всички случаи (които могат да бъдат много, ако са били въведени много пъти през последния месец например). така че наистина искам да отпечатам въз основа на driverL и разбира се да се свържа с думата за търсене в зависимост от това какво се търси.

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:20:07 DL: kahisds8687 Компания: aerotek

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:09:24 DL: kahisds8687 Компания: aerotek

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:07:02 DL: kahisds8687 Компания: aerotek

Първо име: joe Фамилия: aef Пристигане: 2014-06-24 14:46:34 DL: jior21r3 Компания:

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:04:13 DL: kahisds8687 Компания: aerotek

текуща декларация: $sql= "ИЗБЕРЕТЕ * ОТ изпълнителя WHERE CONCAT( СОБСТВЕНО ИМЕ,' ', ФАМИЛНО ИМЕ,' ', ПРИСТИГАНЕ, ' ', ID, ' ', DRIVERL ) като '%$searchTerm%' GROUP BY DRIVERL";

бих искал само по един от всеки човек да бъде отпечатан толкова идеално:

Първо име: joe Фамилия: aef Пристигане: 2014-06-24 14:46:34 DL: jior21r3 Компания:

Първо име: calvin Фамилия: joe Пристигане: 2014-06-24 14:04:13 DL: kahisds8687 Компания: aerotek


person user3711444    schedule 25.06.2014    source източник
comment
точка на поръчка: потенциал за инжектиране на sql и заявката по-горе ще създаде пълно сканиране на таблица, докато свързвате полетата заедно.   -  person Ruskin    schedule 25.06.2014
comment
Вашият код вече връща списъка с отделни записи. Ако искате да покажете Calvin Joe само веднъж - тогава трябва да използвате distinct в началото на заявката и да се отървете от времето на пристигане във вашия набор от резултати.   -  person entropic    schedule 25.06.2014


Отговори (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 като стойност на пристигане.

person Jenn    schedule 25.06.2014
comment
оценявам помощта :), но все още имам проблем/притеснение. така че опитах първия случай и получавам грешки, занимаващи се с ' Предупреждение: mysql_num_rows() очаква параметър 1 да бъде ресурс, булев, даден в C:\wamp\www\contractor\searchpage.php на ред 69 ' СЪЩО Опитвам се да използвайте шофьорската книжка, за да разграничите двама лица с едно и също име или фамилия, ако по това търсят. и имам всички случаи, отпечатани от таблицата на конкретното име, където наистина бих искал просто един от всеки конкретен човек. така че наистина само един calvin joe и joe aef. надявам се, че има смисъл - person user3711444; 25.06.2014
comment
@user3711444 Не разбирам съвсем. Можете ли да актуализирате въпроса си, за да включите този проблем? Можете ли да опитате заявката без пристигането в селекцията изобщо и да видите дали получавате грешката? Така че „Изберете различно име, фамилия, dl, компания от ...“ - person Jenn; 25.06.2014
comment
@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