mysql - 在 MySQL 中,使用 GROUP BY 和 HAVING 从两个表中选择信息的问题
问题描述
找出至少一个申请人拥有或至少一个职位需要的所有技能的名称。不要多次列出相同的名称。
CREATE TABLE SPOSSESSED(
anumber DECIMAL(6) NOT NULL, /*applicant*/
sname VARCHAR(30) NOT NULL, /*skill name*/
slevel DECIMAL(2) NOT NULL);
CREATE TABLE SNEEDED(
pnumber DECIMAL(8) NOT NULL, /*position*/
sname VARCHAR(30) NOT NULL, /*skill name*/
slevel DECIMAL(2) NOT NULL);
如果每张桌子都是单独的,我已经出来了
SELECT sname FROM SPOSSESSED GROUP BY sname HAVING COUNT(anumber) >= 1;
SELECT sname FROM SNEEDED GROUP BY sname HAVING COUNT (pnumber) >= 1;
我遇到的问题是将这两者结合起来而不加入/联合。有一个我试过的方法:
SELECT SPOSSESSED.sname FROM SPOSSESSED, SNEEDED
WHERE SPOSSESSED.sname = SNEEDED.sname
GROUP BY SPOSSESSED.sname
HAVING COUNT (pnumber) >= 1
OR COUNT (anumber) >= 1;
但是,结果不等于单个 SELECT 语句。
解决方案
你的问题没有意义。更糟糕的是,它似乎在推动使用逗号来表达连接——这种方式太老套了,以至于让我想起女性被鼓励吸烟或在汽油中添加铅。
这是在 MySQL 中做你想做的事情的一种方法:
create temporary table t as
SELECT sname FROM SPOSSESSED GROUP BY sname HAVING COUNT(anumber) >= 1;
insert into t (sname)
SELECT sname FROM SNEEDED GROUP BY sname HAVING COUNT(pnumber) >= 1;
select distinct sname
from t;
我应该指出,having
条件是无关紧要的。您所指的数字是 never NULL
。我把它留在了,因为它是您原始查询的一部分。
回答这个问题的最合理的方法可能是既不使用显式join
也不使用union
. 它确实假设了一个“技能”表,但是:
select s.*
from skills s
where exists (select 1 from spossessed p where p.sname = s.sname) or
exists (select 1 from sneeded n where n.sname = s.sname);
推荐阅读
- spring - 如何使用 java 配置在 Spring Integration 中使用 FileSplitter (@Splitter) 拆分文件
- laravel - Laravel:从 2 个不同的域访问网站,其中一个通过 https,另一个通过 http
- python - 为 google bigquery 构建 docker 镜像
- flutter - 当我尝试运行颤振医生或任何颤振命令时,它会给出错误
- android - 滚动视图在警报对话框中不起作用
- object - 我想通过 three.js 库添加表面选择功能
- javascript - 使用 Jest.js 模拟复杂模块
- java - AWS IoT SDK - 构建 AWSIotData 和 AWSIotClient 时出现异常
- laravel - Laravel Mix 总是包含 jQuery
- java - 在 SQL 数据库字段中存储可搜索的数组