【问题标题】:Postgres query SELECT when field is set设置字段时 Postgres 查询 SELECT
【发布时间】:2018-07-08 03:59:14
【问题描述】:

我有一张桌子topics。我有两个查询选择不同的数据,一个用于表votings,一个来自表messagestopics 有一个字段m_group,它是messages 的外键。此字段可以是NULLmessages 中的条目组(group 是此表中的一个字段)。如果此字段设置为组,则应执行查询 1 以选择所有消息,如果未设置,则应执行查询 2 以选择此特定主题的所有投票。我在 Apache Web 服务器上使用 Postgres 和 PHP。

现在我的问题是推荐的方法是什么。我想出了两个解决方案(不确定解决方案 2 是否真的可行,还没有尝试过)。


解决方案 1

首先选择字段m_group。然后确定是否通过 PHP 设置并执行相关查询。


解决方案 2

使用IF THEN ELSE 声明

基本上查询应该是这样的

IF t.m_group IS NULL 
THEN
    query2
ELSE
    query1

如前所述,我不确定解决方案 2 是否可行。处理这个问题的最佳方法是什么?方案一执行两个查询,我觉得这样效率低。


更新

如上所述,它应该针对特定主题执行查询。你有这个主题的id。如何在解决方案 2 中指定这一点?如果在查询中指定,IF THEN ELSE 语句是否已经知道主题的别名 t

【问题讨论】:

  • 解决方案2不也做两个查询吗?顺便说一句,我更喜欢选项 2。
  • @TimBiegeleisen 我不完全知道这是如何工作的。但是由于运行 PHP 的服务器与我的数据库服务器不同,我猜最好只向数据库服务器发送一个命令。
  • 请问您能否提供查询 1 和 2 以查看其结果的结构?通常,IF 必须在两个分支中返回相同类型的结果。
  • 您是否考虑过使用存储过程来处理这个问题?您将调用 proc 一次,然后在内部决定运行两个查询中的哪一个。
  • @RomanHocke 查询有点复杂,但它们都具有相同的结构。它们每个条目返回 3 个值 idtitleSUM(subtable_id) AS votes,这也意味着表 votingsmessages 都有子表来存储其他数据

标签: php sql postgresql


【解决方案1】:

如果我理解正确,您需要使用两个子查询作为数据集,而您应该使用其中一个作为源,具体取决于 m_group 字段中的内容。如果您只选择几行,则第二种方法很好。但是,如果您需要从表中获取大量数据,那么您将需要执行过多的子查询。我宁愿先从主题中获取您需要的所有数据,然后通过这两个查询选择您需要的数据。 伪 SQL 查询将如下所示:

with t1 as (select t.id, group_m, ... from topics t where t.m_group is not null),
t2 as (select t.id, ... from topics t where t.m_group is null)
select id, title, SUM(subtable_id) AS votes
from query1
join t1 on t1.id = query1.id and...
union
select id, title, SUM(subtable_id) AS votes
from query2
join t2 on t2.id = query2.id and... 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    相关资源
    最近更新 更多