gpt4 book ai didi

sql - 我需要有关 SQL 查询的帮助。获取一个条目,它是最新的修订版和它的字段

转载 作者:行者123 更新时间:2023-12-01 02:31:30 25 4
gpt4 key购买 nike

我正在根据自己的需要构建一个 CMS,并完成了我的数据库布局规划。

基本上,我将所有可能的数据模型抽象为“部分”,并将所有条目抽象为一张表。最终布局如下:

数据库图: I have yet to be allowed to post images, so here is a link to a diagram of my database .

条目 (section_entries) 是其部分 (sections) 的子项。我将对条目的所有编辑保存在新修订版 (section_entries_revisions) 中,并跟踪部分 (section_revisions) 的修订版,以匹配修订版的值,到进行条目修订时存在的部分的字段。 section-revisions 可以有许多字段 (section_revision_fields),用于定义该部分中条目的属性。字段(section_revision_fields)和条目修订(section_entry_revisions)之间存在多对多关系,存储由部分修订定义的属性值.

数据库图上的键图标指示哪些列是主键的一部分。大多数表都具有识别关系。

如果图表令人困惑,请随时提出问题。

现在,这是我用过的最复杂的 SQL,获取数据的任务有点令人生畏。

基本上我需要帮助的是获取一个条目,当唯一已知的变量是; section_id, section_entry_id。查询应获取该条目的最新修订版(最近,即具有最高 id 的修订版),以及与 中的 section_revision_id 相对应的 section_revision 模型section_entry_revisions 表。它还应获取部分修订版中字段的值。

我希望得到一个查询结果,其中的行数与该部分中的字段数一样多。每行将包含条目和部分的信息,然后是其中一个字段的信息(例如,每行对应一个字段及其值)。

我尽力解释了。同样,如果我的描述有任何不足之处,请随时提出问题。

我希望有人能接受挑战。最好的祝福。 :-)

到目前为止的查询

SELECT ser.*, sersrf.value

FROM section_entry_revisions AS ser

JOIN section_entry_revisions_section_revision_fields AS sersrf
ON sersrf.section_entry_revision_id = ser.id

WHERE ser.section_id = 1
AND ser.section_entry_id = 1
AND ser.id = (

SELECT MAX(subser.id)

FROM section_entry_revisions AS subser

WHERE subser.section_id = ser.section_id
AND subser.section_entry_id = ser.section_entry_id

)

现在我想加入字段值,以及来自特定 section_revision 的字段名称。

最佳答案

听起来真正的诀窍是找到最后的修订版。您没有指定“last”是如何确定的,所以我假设它是基于 created。您的图表也没有指定主键,所以我假设 section_entry_revisions 的 PK 是 Id

Select ...
From section_entry_revisions As SER
Join section_entry_revisions_section_revision_fields As SRF
On SRF.section_revision_id = SER.Id
...
Where SER.sectionId = @SectionId
And SER.section_entry_id = @SectionEntryId
And SER.id = (
Select Max(SER1.id)
From section_entry_revisions As SER1
Where SER1.section_Id = SER.section_Id
And SER1.section_entry_id = SER.section_entry_id
Group By SER1.sectionId, SER1.section_entry_id
Having SER.created= Max(SER1.created)
)

添加

如果“last”仅由 section_entry_revisions.id 确定,那么您可以删除我在原始示例的子查询中使用的 Having 和 Group By 子句。

如果 key 图标代表主键,那说明section_idsection_entry_idid都是主键?该表中的 Id 是身份列吗?如果是这样,为什么它不是单独的主键和候选键的其他两个部分(唯一约束)?

要获取 section_revision_fields 值,您应该能够直接连接到 section_revision_fields 表。子查询所做的只是将 section_entry_revisions 行过滤为一行。现在您已经知道了,您可以按照关系使用标准连接从相关表中获取数据,除非这里还有其他问题需要解决。这是修改后的查询:

Select ...
From section_entry_revisions As SER
Join section_revision_fields As SRF
On SRF.section_id = SER.section_id
And SRF.section_revision_id = SER.section_revision_id
...
Where SER.sectionId = @SectionId
And SER.section_entry_id = @SectionEntryId
And SER.id = (
Select Max(SER1.id)
From section_entry_revisions As SER1
Where SER1.section_Id = SER.section_Id
And SER1.section_entry_id = SER.section_entry_id
)

关于sql - 我需要有关 SQL 查询的帮助。获取一个条目,它是最新的修订版和它的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946339/

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