我有一个列出表中记录的页面。在表的标题中,我们有过滤器过滤掉所选值的记录。为了填充这些过滤器列表,我需要从数据库中获取不同的值。例如,当列出一家公司的员工让我们说我有名称,年龄,工资的过滤器时,那么我有单独的查询,如
select distinct name from employee where company = `fordwagen`
如何在单个SQL中获取名称,年龄和工资的所有三个列表,而不是有三个数据库调用?
答案 0 :(得分:2)
select name as filter_value, 'name_filter' as filter_type from employee group by name
union
select ages as filter_value, 'age_filter' as filter_type from employee group by ages
union
select salary as filter_value, 'salary_filter' as filter_type from employee group by salary
group by将具有与distinct不同的效果,您可以使用任一语法。这会为您提供filter_value
和filter type
的列表。使用正确的filter_type
填充每个筛选器列表。
希望我能得到你在这里问的权利...如果我不在的话评论
答案 1 :(得分:1)
会有那么多重复的名字吗?一家满是史密斯先生和夫人的公司?可能不是。
如此简单
select first_name, last_name, age, salary from employees;
得到1000个员工记录,而不是250个名字,700个姓氏,30个年龄和120个薪水。然后循环浏览应用中的记录,尽可能减少流量。
答案 2 :(得分:0)
- 我不想花时间为每个列表输入数据库,实际上我有十多个列表。
醇>
无论您发出十个单独的呼叫还是一个组合呼叫,网络流量 - 数据包的数量 - 大致相同。
- 即使我使用连接池,我也不想在同一页面上多次点击数据库。
醇>
好。但这更多的是你如何设计你的应用程序层。
- 我需要为不同的数据库调用创建不同的方法,我不希望在需求发生变化的情况下在很多地方进行更改。
醇>
你似乎对“清洁代码”有一种不同寻常的理解。单一责任原则(SOLID中的 S )是清洁代码的基石。有十种方法,每种方法做一件事比一件做十件事的方法更清洁。
也许您需要的是缓存?如果过滤器的目标表相对缓慢变化,那么结果集缓存可能非常有效。 Oracle在数据库和客户端都支持缓存 - 内置失效。 Find out more。即使您的目标表经常更改,也许您可以维护更静态的过滤器表。