【问题标题】:SQL distinct on one column with two tablesSQL 在具有两个表的一列上不同
【发布时间】:2015-02-23 21:02:40
【问题描述】:

我无法正确获取此查询。我正在使用 Postgres 并尝试查询用户查看的最后 15 个客户端。

client
专栏id, name...

impressions
imressionable_id, user_id, created_at ...

impressable_id 等于 client_id 并且可以在此字段上连接表。

我需要获取用户查看的最后 15 个 DISTINCT 客户端名称的列表,并按 created_at 日期排序 DESC。目前的问题是对印象表的查询会产生许多重复的条目,但具有唯一的 created_at 时间戳,因为每次查看客户端时它都会创建一个新的印象记录。

所以,一个查询

select impressions.impressionable_id, created_at from impressions where user_id = 1 order by created_at DESC  

将产生:

  impressionable_id   created_at
        1            2014-11-14 21:44:47.705167 
        1            2014-11-14 21:32:15.411488 
        3            2014-11-14 18:43:26.020719 
        1            2014-11-14 18:42:15.974442
        5            2014-11-14 18:41:10.609617 
        3            2014-10-29 20:53:01.383896

我需要一个可以给我的查询:

1    John Doe     2014-11-14 21:44:47.705167 
3    Jay Smith    2014-11-14 18:43:26.020719
5    Tim Jones    2014-11-14 18:41:10.609617 

等等。非常感谢任何帮助!

【问题讨论】:

  • select max(created_at) .... group by impressionable_id?

标签: sql postgresql


【解决方案1】:

使用MAX()GROUP BY

select I.impressionable_id,c.name, MAX(I.created_at) as created_at 
from impressions JOIN
     client c ON c.id = I.user_id
group by impressionable_id,c.name
order by created_at DESC
limit 15;

【讨论】:

  • 谢谢,但这只能从一张表中获取记录。
  • @RKRaider:那是因为,我不知道你的表结构。现在我已经通过加入更新了我的答案。
  • 这是我的工作解决方案,除了连接子句位于 I.impressionable_id 而不是 user_id 上。然后我为 user_id 添加了 where 子句。
【解决方案2】:
SELECT y.* FROM 
(
    SELECT 
        DISTINCT ON (x.id) x.id, x.name, x.created_at 
    FROM (SELECT c.id, c.name, i.created_at FROM clients c RIGHT JOIN impressions i ON c.id = i.user_id) x
) y 
ORDER BY y.created_at DESC LIMIT 15;

【讨论】:

  • 我给出了答案,因为我能够修复它添加修复:c.id = i.impressionable_id where i.user_id =1 代替 c.id = i.user_id。跨度>
  • 经过仔细测试,这仅适用于第一条记录,然后它不会获取下一个客户端 ID 的最新记录。
  • @RKRaider 检查屏幕截图:http://i.gyazo.com/bf4e470fbac69e330810ca5e5f7c9945.png我创建了您的两个表并运行查询。您是否遗漏了一些说它无法正常工作的内容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多