设置字段时Postgres查询SELECT

时间:2018-01-29 12:42:33

标签: php sql postgresql

我有一张桌子topics。我有两个选择不同数据的查询,一个用于表votings,另一个用于表messagestopics有一个字段m_group,它是messages的外键。此字段可以是NULL,也可以是messages中的条目的组(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是否可行。处理这个问题的最佳方法是什么?解决方案1执行两个查询,我认为这是低效的。

更新

如上所述,它应该对特定主题执行查询。您拥有此主题的id。如何在解决方案2中指定这个?如果在查询中指定了IF THEN ELSE语句,那么t语句是否已知道主题的别名for (Item item : results) { item.load(PropSet); }

1 个答案:

答案 0 :(得分:0)

如果我理解正确,则需要使用两个子查询作为数据集,而根据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...