在MySQL中,使用GROUP BY和HAVING从两个表中选择信息的问题

时间:2018-05-06 13:12:53

标签: mysql sql 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;

我遇到的问题是将这两个结合在一起WITHOUT JOIN / UNION。我尝试过一种方法:

SELECT SPOSSESSED.sname FROM SPOSSESSED, SNEEDED
WHERE SPOSSESSED.sname = SNEEDED.sname
GROUP BY SPOSSESSED.sname
HAVING COUNT (pnumber) >= 1 
OR COUNT (anumber) >= 1;

但是,结果不等于单个SELECT语句。

1 个答案:

答案 0 :(得分:0)

你的问题没有意义。更糟糕的是,它似乎推动使用逗号来表达连接 - 这是一种过时的方式,它让我想到女性被鼓励吸烟或添加铅汽油。

以下是在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条件无关紧要。您所指的数字绝不是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);