Postgres DISTINCT查询问题

时间:2016-07-04 16:04:18

标签: postgresql

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\' )

由于某些原因,上述查询返回以下错误:

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

我只想返回独特的用户,但我真的不知道它有什么问题。

感谢您的帮助

2 个答案:

答案 0 :(得分: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\' );

注意表别名如何使查询更容易编写和阅读。

答案 1 :(得分:0)

只是执行错误消息说明我将在ABS( "Searches"."start_date" - date '2016-07-07' )列表中包含表达式SELECT。无需更改查询逻辑 处理结果后,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对应类似的结果。