gpt4 book ai didi

SQL 查询检查第一个表中的列或查找第二个表中的行

转载 作者:行者123 更新时间:2023-11-29 13:28:18 26 4
gpt4 key购买 nike

所以我有以下情况:

我有一个 post 模型,它总是有 2 个或 4 个参数

class Post < ActiveRecord::Base
# has two columns, status and published (boolean)
has_many :arguments
end

和一个论证模型

class Argument < ActiveRecord::Base
# has moderated column (boolean) and text
belongs_to :post
end

我想知道我是否可以编写一个查询来获取符合以下条件的帖子:

1) 帖子有未经审核的参数,其中第一个参数按 id 排序(不是 updated_at)属于 id = 5 的用户(例如)

------ 或 ------

2) 帖子status = 1 and published = true

PS.: 我正在使用 PostgreSQL。

最佳答案

转换为 SQL:

SELECT p.*
FROM posts p
LEFT JOIN (
SELECT DISTINCT ON (post_id)
post_id, user_id
FROM arguments
WHERE moderated = FALSE
ORDER BY post_id, id
) a ON a.post_id = p.id AND a.user_id = 5
WHERE a.post_id IS NOT NULL OR -- condition 1
(a.status = 1 and a.published); -- condition 2

DISTINCT ON 的详细信息:

为什么要使用 LEFT JOIN

如果只有条件 1),我们可以简化:

SELECT p.*
FROM posts p
JOIN (
SELECT DISTINCT ...
) a ON a.post_id = p.id AND a.user_id = 5;

但是您添加了替代(不是附加)条件 2)。如果我们使用普通的 [INNER] JOIN,则未通过条件 1) 的帖子将立即从选择中删除,并且永远不会有第二次机会。我添加了多余的括号(operator precedence 可以在没有括号的情况下为我们工作)和换行符以指出这是“另一种方式”:

(a.status = 1 and a.published)

当然,我们现在必须添加条件检查 1):

a.post_id IS NOT NULL

这在不复制行的情况下工作,因为子查询为每个帖子返回恰好 1 或 0 行(而不是更多)。

这是解决它的一个方法。对于每个帖子只有很少的属性(2 - 4)和大量的合格属性来说,应该是一个很好的选择。根据您的实际数据分布,可能还有其他更快的查询技术:

关于SQL 查询检查第一个表中的列或查找第二个表中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29348304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com