2014-12-22 7 views
0

У меня есть этот запрос, который работает отлично:SQL: Не удается получить уникальные имена/пользователей

SELECT 
    u.id 
    , u.mobile 
    , u.name 
    , (NOW() - u.authenticationTime) AS authenticateTimeDifference 
    , u.IP 
    , c.providerid 
    , c.requestid 
    , c.status 
    , u.port 
FROM contacts c 
LEFT JOIN users u ON u.id = 
IF (
     c.providerid = 2 
     , c.requestid 
     , c.providerid 
    ) WHERE (
     c.providerid = 2 
     AND c.status = 1 
    ) 
    OR c.requestid = 2 

ORDER BY authenticateTimeDifference 

Теперь я хотел только выбрать DISTINCT u.name поля (или уникальных пользователей), поэтому я изменил u.name к DISTINCT(u.name), но я Я получаю сообщение об ошибке:

You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 'DISTINCT(u.name) , 
(NOW() - u.authenticationTime) AS au' at line 4 

Я также попытался добавить GROUP BY u.name, но все еще не везение.

Может ли кто-нибудь сказать, как выбрать уникальные имена/пользователей по вышеуказанному запросу?

Спасибо за помощь

+0

Для каждого сгруппированного значения 'name', какие значения вы хотите выбрать для других столбцов' id', 'mobile' и т. Д. ... ?? добавьте некоторые примеры данных и ожидаемый результат. –

+0

Кроме того, где вы обнаружили, что 'unique' определяется в документации? –

+0

Что это за 'UNIQUE()'? Задача 'group by' будет возвращать все уникальные имена. –

ответ

1

Во-первых, вам нужно использовать group by:

SELECT 
    u.id 
    , u.mobile 
    , u.name 
    , (NOW() - u.authenticationTime) AS authenticateTimeDifference 
    , u.IP 
    , c.providerid 
    , c.requestid 
    , c.status 
    , u.port 
FROM contacts c 
LEFT JOIN users u ON u.id = 
IF (
     c.providerid = 2 
     , c.requestid 
     , c.providerid 
    ) WHERE (
     c.providerid = 2 
     AND c.status = 1 
    ) 
    OR c.requestid = 2 
GROUP BY u.name 
ORDER BY authenticateTimeDifference 

Затем вы должны решить, что делать с другими значениями. Должны ли они показывать самое низкое значение, наибольшее значение, среднее и т. Д.? Поскольку вы хотите группировать только имя, вам нужно выбрать один для полей не в group by.

+0

oh означает, что я клал группу не в то место. Спасибо, я буду отмечать это как правильный ответ – Dev01

0

По мне Distinct должно произойти сразу после выбора. Так что ваш запрос должен выглядеть так: -

SELECT DISTINCT u.id, u.mobile, u.name, (NOW() - u.authenticationTime) AS authenticateTimeDifference 
, u.IP, c.providerid, c.requestid, c.status, u.port 
FROM contacts c 
LEFT JOIN users u ON u.id = 
IF (c.providerid = 2, c.requestid, c.providerid) 
WHERE (
    c.providerid = 2 
    AND c.status = 1 
) 
OR c.requestid = 2 

ORDER BY authenticateTimeDifference 
Смежные вопросы