Как использовать SELECT DISTINCT и CONCAT в одном выражении SQL - PullRequest
5 голосов
/ 27 января 2012

Итак, я передаю результаты этого SQL в массив.Массив позже становится предложением для текстового поля, которое работает во время набора текста.Я хочу, чтобы он возвращал каждое имя только 1 раз, даже если у этого человека несколько встреч.В настоящее время возвращаются все встречи для человека с таким именем, поэтому, если у «Брэда Робинса» 5 назначений, и я начинаю набирать «Брэд», в предложениях отображается «Брэд Робинс» 5 раз, а не только один раз.

$sql = "SELECT DISTINCT CONCAT(clients.studentFirstName, ' ', clients.studentLastName) AS name, appointments.location, appointments.subLocation, appointments.appointmentAddress1, appointments.appointmentAddress2, appointments.appointmentCity, appointments.appointmentState, appointments.appointmentZip, appointments.startTime, appointments.endTime, appointments.date, clients.school
                    FROM appointments JOIN clients
                    ON appointments.clientID = clients.clientID
                    WHERE CONCAT(clients.studentFirstName, ' ', clients.studentLastName) = '".$roommate."' AND clients.school = '".$school."';";

Мне кажется, что DISTINCT и CONCAT не очень хорошо играют вместе.

Ответы [ 6 ]

6 голосов
/ 27 января 2012

Проблема в других полях; DISTINCT относится ко всему результату. Вероятно, лучше всего разделить запросы или заполнить 2 разных массива; если вы ORDER BY name, вы можете удалить дубликаты, копируя их в массив dest только при изменении имени.

4 голосов
/ 27 января 2012

Не используйте DISTINCT, используйте группу по:

$sql = "SELECT CONCAT(clients.studentFirstName, ' ', clients.studentLastName) AS name, appointments.location, appointments.subLocation, appointments.appointmentAddress1, appointments.appointmentAddress2, appointments.appointmentCity, appointments.appointmentState, appointments.appointmentZip, appointments.startTime, appointments.endTime, appointments.date, clients.school
                FROM appointments JOIN clients
                ON appointments.clientID = clients.clientID
                WHERE CONCAT(clients.studentFirstName, ' ', clients.studentLastName) = '".$roommate."' AND clients.school = '".$school."' group by CONCAT(clients.studentFirstName, ' ', clients.studentLastName);";

Также будьте осторожны с XSS в $ school и $ roomate, если это доступно снаружи.

4 голосов
/ 27 января 2012

Различение идет против всей строки ВСЕХ столбцов, а не только части имени ... Так что, если встречи происходят в разную дату / время, в разных местах и ​​т. Д., Они все появятся. Если все, что вы хотите показать, это часть NAME, удалите оставшуюся часть другого контента. Запросите доступные встречи ПОСЛЕ выбора человека.

1 голос
/ 27 января 2012

Вы можете использовать

group by name

в конце, что приведет к тому, что запрос будет возвращать только одно имя, но тогда вы не сможете предсказать, какие результаты встречи будут возвращены в случаях, когда клиентимеет несколько встреч, и запрос перестает быть очень полезным.

Как уже отмечали другие, вам, вероятно, следует просто получить список встреч после выбора клиента.

0 голосов
/ 25 июня 2019
select colA||' - '||colB
from table1
where colA like 'beer%'
group by colA||' - '||colB
order by colA||' - '||colB
;
0 голосов
/ 06 марта 2017

Выберите отличный конкат (....) От ....

...