查找仅属于特定办公室的相关邮政编码

时间:2018-09-27 07:56:45

标签: mysql sql

晕, 我有两个表offices_postcodes和offices

offices_postcodes = id,postcode,office_id
offices   = id,offices,department 

情况是: 一个办公室有许多邮政编码,而一个邮政编码属于许多办公室, 示例:

postcode 0100036 has relation with office A
postcode 0100036 has relation with office B
postcode 0100035 only has relation with office A
postcode 0100037 has relation with office A
postcode 0100037 has relation with office B
postcode 0100039 only has relation with office A

我想查找所有属于Office A但不属于Office B的邮政编码,在这种情况下为0100035和0100039。

我们能做到吗?, 这是我到目前为止所做的,

SELECT Count(`offices_postcodes`.postcode), 
       `offices_postcodes`.postcode 
FROM   `offices_postcodes`, 
       `offices` 
WHERE  `offices_postcodes`.office_id = `offices`.id 
       AND `offices`.department_id = 1 
       AND offices_postcodes.deleted_at IS NULL 
GROUP  BY `offices_postcodes`.postcode 
HAVING Count(`offices_postcodes`.postcode) = 1 

数据邮政编码:

id  postcode    office_id
1   0100036     271 
2   0100036     275 
3   0100035     271 
4   0100037     271
5   0100037     275 
6   0100039     271 

数据办公室

id      offices     department_id
271     A           1
275     B           1

预期结果

postcode 
0100035
0100039

1 个答案:

答案 0 :(得分:1)

我认为您可以尝试使用JOIN并在op.office_id = o.id上连接条件

模式(MySQL v5.7)

CREATE TABLE offices_postcodes(
   id INT,
   postcode VARCHAR(50),
   office_id INT
);




INSERT INTO offices_postcodes VALUES (1,'0100036',271); 
INSERT INTO offices_postcodes VALUES (2,'0100036',275); 
INSERT INTO offices_postcodes VALUES (3,'0100035',271); 
INSERT INTO offices_postcodes VALUES (4,'0100037',271);
INSERT INTO offices_postcodes VALUES (5,'0100037',275); 
INSERT INTO offices_postcodes VALUES (6,'0100039',271); 

CREATE TABLE offices(
   id INT,
   postcode VARCHAR(50),
   department_id INT
);


INSERT INTO offices VALUES (271,'A',1);
INSERT INTO offices VALUES (275,'B',1);

查询#1

SELECT  op.postcode 
FROM `offices_postcodes` op JOIN `offices` o
ON op.office_id = o.id 
GROUP BY op.postcode 
having  Count(op.postcode) = 1;

| postcode |
| -------- |
| 0100035  |
| 0100039  |

View on DB Fiddle