Postgres查询:当字段设置时使用SELECT

3
我有一个表格topics。我有两个查询,一个是从表格votings中选择不同的数据,另一个是从表格messages中选择不同的数据。topics有一个字段m_group,它是messages的外键。这个字段可以是NULL或者是messages条目的一个组(group是这个表格中的一个字段)。如果这个字段被设置为一个组,它应该执行查询1来选择所有的消息,如果没有设置,则应该执行查询2来选择特定主题的所有投票。我使用Postgres和PHP在Apache Web服务器上。
现在我的问题是哪种方法更好。我想出了两个解决方案(不确定解决方案2是否可行,尚未尝试)。
解决方案1 首先选择字段m_group。然后通过PHP确定是否设置,并执行相关的查询。
解决方案2 使用IF THEN ELSE语句。 基本上,查询应该看起来像这样:
IF t.m_group IS NULL 
THEN
    query2
ELSE
    query1

如前所述,我不确定解决方案2是否可行。最好的处理方式是什么?解决方案1执行了两个查询,我认为这是低效的。


更新

如上所述,它应该针对特定主题执行查询。您有此主题的id。在解决方案2中如何指定此项?如果在查询中指定了别名tIF THEN ELSE语句是否已知?


方案2不也执行了两个查询吗?顺便说一句,我更喜欢方案2。 - Tim Biegeleisen
@TimBiegeleisen 我不太清楚这是如何工作的。但由于在我的情况下运行PHP的服务器与数据库服务器不同,我想最好只向数据库服务器发送一个命令。 - Ian Fako
请您提供查询1和查询2以查看它们结果的结构?通常,“IF”语句在两个分支中必须返回相同类型的结果。 - Roman Hocke
你考虑过使用存储过程来处理这个问题吗?你只需要调用一次存储过程,然后在内部它会决定运行哪个查询。 - Tim Biegeleisen
@RomanHocke 这些查询有点复杂,但它们的结构相同。每个条目返回3个值:idtitleSUM(subtable_id) AS votes。这也意味着votingsmessages两个表都有子表来存储其他数据。 - Ian Fako
为什么不编写一个单一的查询,并使用CASE语句为每个字段提供不同的结果呢? - Greg Viers
1个回答

0

如果我理解正确,您需要使用两个子查询作为数据集,而您应该根据m_group字段中的内容使用其中一个作为源。如果您只选择了几行,则您的第二种方法很好。但是,如果您需要从表中获取大量数据,则这种方式将需要执行太多的子查询。我宁愿先从topics中获取您需要的所有数据,然后使用两个查询选择您需要的内容。伪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... 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接