首页 > 解决方案 > 在 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 语句。

标签: mysqlsqlhaving

解决方案


你的问题没有意义。更糟糕的是,它似乎在推动使用逗号来表达连接——这种方式太老套了,以至于让我想起女性被鼓励吸烟或在汽油中添加铅。

这是在 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);

推荐阅读