gpt4 book ai didi

mysql - SQL 中的高级过滤器

转载 作者:行者123 更新时间:2023-11-29 07:47:52 25 4
gpt4 key购买 nike

我的 SQL 过滤出现问题。请看一下数据库的架构。

enter image description here

现在,我希望找到懂得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 = 3)
  • 约书亚,亚特兰大(因为 PHP > 1)
  • Christopher,芝加哥(因为 PHP > 1)

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

而且,我想将程序员的所有技能集中到一起;在这里,约书亚分在两排。如何解决?

考虑到所有因素,最后一个问题。获取方式:

  • 具备 PHP ●●/●●●、JS ●●● 和 HTML ●/●●/●●● 技能的程序员
  • 拥有 PHP ●●/●●● 技能的程序员,PHP 经验 2 年以上,JS ●●● 经验 4 年以上
  • 具备 PHP ●/●●/●●● 和 JS ●●● 技能的程序员,在这两个/任何领域至少拥有 3 年以上经验

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

<小时/>

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

最佳答案

这是“集合内集合”问题的示例。我喜欢使用聚合和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;

关于mysql - SQL 中的高级过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com