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

现在,我想让熟悉PHP的程序员掌握技能/和Java的技能。我执行了以下查询:
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,但他还是回来了。在主要条件之间将OR替换为AND会导致不返回任何内容。
此外,我希望在一行中掌握程序员的所有技能;在这里,约书亚位于两个不同的行。怎么修呢?
所有的事情,最后的问题。如何获得:
希望这是可能的。提前谢谢。
专注于日期的编辑操作没有问题,不需要计算日期之间的差异,可以只包含年份,即2010年。一般来说,日期不是重点。
发布于 2014-12-02 16:06:58
这是一个“集内集”问题的例子。我喜欢使用聚合和having来解决这些问题。
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()
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;发布于 2014-12-04 06:07:53
这会给你你想要的东西,但它一点也不灵活。
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;如果您要执行许多这类查询,您可能会考虑为每个技能集创建一个视图:
create view JavaSkills as
select programmer, lang, level, exp_from
from skills
where lang = 'Java'那么查询将是
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;执行计划应该是相似的,如果不是完全相同的话,但是查询更容易阅读。这也是相当尴尬的维护,但一个人做自己能做的。;)
https://stackoverflow.com/questions/27253759
复制相似问题