首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL中的高级过滤器

SQL中的高级过滤器
EN

Stack Overflow用户
提问于 2014-12-02 16:03:22
回答 2查看 1.9K关注 0票数 0

我对SQL中的筛选有问题。请看一下数据库的架构。

现在,我想让熟悉PHP的程序员掌握技能/和Java的技能。我执行了以下查询:

代码语言:javascript
复制
SELECT p.name, p.city FROM programmers p INNER JOIN skills s
ON p.id = s.programmer
WHERE ( s.lang = 'PHP' AND s.level > 1 ) OR ( s.lang = 'Java' AND s.level = 3 );

我得到的是

  • 约书亚,亚特兰大(因为Java = 3)
  • 约书亚,亚特兰大(因为PHP > 1)
  • 克里斯托弗,芝加哥(因为PHP > 1)

但克里斯托弗不懂Java,但他还是回来了。在主要条件之间将OR替换为AND会导致不返回任何内容。

此外,我希望在一行中掌握程序员的所有技能;在这里,约书亚位于两个不同的行。怎么修呢?

所有的事情,最后的问题。如何获得:

  • 具有PHP /、JS和HTML //技能的程序员
  • 具有PHP /和PHP经验的程序员有2+年的经验,JS有4+的经验
  • 具有PHP //和JS技能的程序员,至少在两年内都有3+经验

希望这是可能的。提前谢谢。

专注于日期的编辑操作没有问题,不需要计算日期之间的差异,可以只包含年份,即2010年。一般来说,日期不是重点。

EN

回答 2

Stack Overflow用户

发布于 2014-12-02 16:06:58

这是一个“集内集”问题的例子。我喜欢使用聚合和having来解决这些问题。

代码语言:javascript
复制
SELECT p.name, p.city
FROM programmers p INNER JOIN
     skills s
     ON p.id = s.programmer
GROUP BY p.name, p.city
HAVING SUM( s.lang = 'PHP' AND s.level > 1 ) > 0 AND
       SUM( s.lang = 'Java' AND s.level = 3 ) > 0;

编辑:

如果您想要技能列表(这不是原始问题的一部分),那么使用group_concat()

代码语言:javascript
复制
SELECT p.name, p.city, group_concat(s.lang, ':', s.level separator '; ');
FROM programmers p INNER JOIN
     skills s
     ON p.id = s.programmer
GROUP BY p.name, p.city
HAVING SUM( s.lang = 'PHP' AND s.level > 1 ) > 0 AND
       SUM( s.lang = 'Java' AND s.level = 3 ) > 0;
票数 2
EN

Stack Overflow用户

发布于 2014-12-04 06:07:53

这会给你你想要的东西,但它一点也不灵活。

代码语言:javascript
复制
select p.name, p.city, php.lang, php.level, j.lang, j.level
from   programmer p
join   skills     php
  on   php.programmer = p.id
join   skills     j
  on   j.programmer = p.id
where  php.lang = 'PHP' and php.level > 1
  and  j.lang = 'Java' and j.level = 3;

如果您要执行许多这类查询,您可能会考虑为每个技能集创建一个视图:

代码语言:javascript
复制
create view JavaSkills as
select programmer, lang, level, exp_from
from   skills
where  lang = 'Java'

那么查询将是

代码语言:javascript
复制
select p.name, p.city, php.lang, php.level, j.lang, j.level
from   programmer p
join   PhpSkills  php
  on   php.programmer = p.id
join   JavaSkills j
  on   j.programmer = p.id
where  php.level > 1
  and  j.level = 3;

执行计划应该是相似的,如果不是完全相同的话,但是查询更容易阅读。这也是相当尴尬的维护,但一个人做自己能做的。;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27253759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档