我有一张桌子topics
。我有两个选择不同数据的查询,一个用于表votings
,另一个用于表messages
。 topics
有一个字段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);
}
?
答案 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...