2016-07-04 63 views
0
SELECT DISTINCT "Users"."id" , "Users".name, 
    "Users"."surname", "Users"."gender", 
    "Users"."dob", "Searches"."start_date" 
FROM "Users" 
    LEFT JOIN "Searches" ON "Users"."id" = "Searches"."user_id" 
WHERE (SQRT(POW(69.1 * ("Users"."latitude" - 45.465454), 2) + POW(69.1 * (9.186515999999983 - "Users"."longitude") * COS("Users"."latitude"/57.3), 2))) < 20 
    AND "Users"."status" = true 
    AND "Users"."id" != 18 
    AND "Searches"."activity" = \'clubbing\' 
    AND "Users"."gender" = \'m\' 
    AND "Users"."age" BETWEEN 18 AND 30 
ORDER BY ABS("Searches"."start_date" - date \'2016-07-07\') 

因为某些原因上面的查询将返回以下错误:Postgres的DISTINCT查询问题

for SELECT DISTINCT, ORDER BY expressions must appear in select list 

我只想要返回唯一用户,但我真的不知道什么是错。

感谢您的帮助

+0

错误信息中你不明白的是什么? –

+0

@GordonLinoff我不知道该怎么做,因为我没有看到任何错误。 start_date已经在SELECT列表 – Anonymous

+0

中。 。它可能需要整个表达式在'select'中。 –

回答

0

在Postgres里,你可以使用DISTINCT ON让每个用户ID一行:

SELECT DISTINCT ON (u."id") u."id", u.name, u."surname", u."gender", u."dob", s."start_date" 
FROM "Users" u LEFT JOIN 
    "Searches" s 
    ON u."id" = s."user_id" 
WHERE (SQRT(POW(69.1 * (u."latitude" - 45.465454), 2) + POW(69.1 * (9.186515999999983 - u."longitude") * COS(u."latitude"/57.3), 2))) < 20 AND 
     u."status" = true AND 
     u."id" != 18 AND "Searches"."activity" = \'clubbing\' AND 
     u."gender" = \'m\' AND 
     u."age" BETWEEN 18 AND 30 
ORDER BY users.id, ABS(s."start_date" - date \'2016-07-07\'); 

通知表的别名如何使查询更容易编写和阅读。

+0

现在我收到了这个错误:error:syntax error at or near“,” – Anonymous

0

只要做错误信息说我会在SELECT列表中包含表达式ABS("Searches"."start_date" - date '2016-07-07')。无需更改您的查询逻辑。
absdiffdate稍后可能会在处理结果时被丢弃。

SELECT DISTINCT "Users"."id" , "Users".name, 
    "Users"."surname", "Users"."gender", 
    "Users"."dob", "Searches"."start_date", 
    ABS("Searches"."start_date" - date '2016-07-07') absdiffdate 
FROM "Users" 
    LEFT JOIN "Searches" ON "Users"."id" = "Searches"."user_id" 
WHERE (SQRT(POW(69.1 * ("Users"."latitude" - 45.465454), 2) + POW(69.1 * (9.186515999999983 - "Users"."longitude") * COS("Users"."latitude"/57.3), 2))) < 20 
    AND "Users"."status" = true 
    AND "Users"."id" != 18 
    AND "Searches"."activity" = 'clubbing' 
    AND "Users"."gender" = 'm' 
    AND "Users"."age" BETWEEN 18 AND 30 
ORDER BY ABS("Searches"."start_date" - date '2016-07-07') 

可能将与更多的记录这个新列结果时DISTINCT应用?
我不这么认为,因为你正在从start_date减去一个常量,类似的start_date对应的结果类似。