【发布时间】:2019-07-08 11:56:23
【问题描述】:
假设您的数据库中有一个表 comments。
评论表有id、text、show、comment_id_no列。
如果用户输入评论,它会在数据库中插入一行
| id | comment_id_no | text | show | inserted_at |
| -- | -------------- | ---- | ---- | ----------- |
| 1 | 1 | hi | true | 1/1/2000 |
如果用户想要更新该评论,它会在数据库中插入一个新行
| id | comment_id_no | text | show | inserted_at |
| -- | -------------- | ---- | ---- | ----------- |
| 1 | 1 | hi | true | 1/1/2000 |
| 2 | 1 | hey | true | 1/1/2001 |
注意它保持相同的comment_id_no。这样我们就可以查看评论的历史记录。
现在用户决定不再显示他们的评论
| id | comment_id_no | text | show | inserted_at |
| -- | -------------- | ---- | ----- | ----------- |
| 1 | 1 | hi | true | 1/1/2000 |
| 2 | 1 | hey | true | 1/1/2001 |
| 3 | 1 | hey | false | 1/1/2002 |
这会对最终用户隐藏评论。
现在发表第二条评论(不是第一条的更新)
| id | comment_id_no | text | show | inserted_at |
| -- | -------------- | ---- | ----- | ----------- |
| 1 | 1 | hi | true | 1/1/2000 |
| 2 | 1 | hey | true | 1/1/2001 |
| 3 | 1 | hey | false | 1/1/2002 |
| 4 | 2 | new | true | 1/1/2003 |
我希望能够选择唯一commend_id_no 的所有最新版本,其中show 等于true。但是,我不希望查询返回 id=2。
查询需要采取的步骤...
- 选择所有最近的、不同的
comment_id_nos。 (应该返回id=3和id=4) - select where show = true(应该只返回
id=4)
注意:我实际上是使用 ecto 在 elixir 中编写此查询,并且希望能够在不使用子查询功能的情况下执行此操作。如果有人可以在 sql 中回答这个问题,我可以自己转换答案。如果有人知道如何在长生不老药中回答这个问题,那么也可以随意回答。
【问题讨论】:
-
请用您正在使用的数据库标记您的问题。
-
@gordon Linoff 我已经更新了标签
-
我建议不要用历史的东西污染工作表。而不是使用单独的听觉/历史表(最好在单独的模式中)并实现一个简单的触发器(这在 postgres 中非常简单)来记录每个插入、更新(如果允许,甚至删除)操作。这不仅会使您的事情变得更简单,而且还可以避免很多问题……我现在不发布示例,因为它没有回答您的实际问题。但是,如果您对此感兴趣,我可以发布一个示例。
-
TL;DR,在不同之后......你看过
HAVING吗? -
你不清楚在哪里之前有不同的。写出完整的句子来真正说出你想要的。 distinct 是否在 where 之前有什么关系?--distinct 保持不同的 rows。除非您删除其他列,否则“distinct comment_id_nos”没有意义。也许您正在谈论在子查询中分组和/或选择不同的。但目前还不清楚。您解决了 cmets 中缺乏明确性的问题,但应将说明编辑到帖子中。 PS 这涉及一个甚至有标签的常见问题解答,greatest-n-per-group。您希望从中获得带有 show=true 的行。
标签: sql postgresql elixir distinct where