首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql按联接表中的字段=1进行分组

Mysql按联接表中的字段=1进行分组
EN

Stack Overflow用户
提问于 2016-12-10 16:41:10
回答 2查看 51关注 0票数 1

我有有制造商的车间,一个车间可以有很多制造商,但只有一个官员。我想要所有有制造商22的车间,但如果他们有相同的增值税,只得到工厂谁是官方的。

我有两张桌子,第一次工作坊

代码语言:javascript
运行
复制
id | name          | vat
-------------------------
 1 | name 1        | B12
 2 | name 2        | B12
 3 | name 3        | B12
 4 | name 4        | E98
 5 | name 5        | A99

二次workshop_manufacturer

代码语言:javascript
运行
复制
id | workshop_id | manufacturer_id  | official
----------------------------------------------
 1 | 1           | 22               | 0               
 2 | 2           | 22               | 0
 3 | 3           | 22               | 1
 4 | 4           | 22               | 0
 5 | 5           | 22               | 1
 5 | 5           | 23               | 0
 5 | 5           | 24               | 0

我想得到独特的车间(集团的增值税),但我想得到一个正式的一个(official=1),如果有许多车间与同一缸谁与该制造商工作。

如果我执行此查询:

代码语言:javascript
运行
复制
SELECT t1.*,t2.* FROM workshop t1
INNER JOIN workshop_manufacturer t2 ON t1.id=t2.workshop_id
WHERE t2.manufacturer.id = 22
GROUP bY t1.vat

我明白了:

代码语言:javascript
运行
复制
id | name    | vat  | official | manufacturer_id 
-----------------------------------------------
 1 | name 1  | B12  | 0       | 22
 4 | name 4  | E98  | 0       | 22
 5 | name 5  | A99  | 1       | 22

我想要这个:

代码语言:javascript
运行
复制
id | name    | vat  | official | manufacturer_id 
-----------------------------------------------
 3 | name 3  | B12  | 1      | 22
 4 | name 4  | E98  | 0      | 22
 5 | name 5  | A99  | 1      | 22

所有的工作坊都是官方和非官方的,但优先考虑的是那些正式的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-10 16:54:20

这是一种优先排序,而不是聚合。但这相当复杂。

以下是每个“vat”研讨会的ids:

代码语言:javascript
运行
复制
select w.vat, max(case when w.official = 1 then w.id end) as official_id,
       max(w.id) as max_id
from workshop_manufacturer wm join
     workshop w
     on w.id = wm.workshop_id
group by w.vat;

有两个id,一个是可用的official,另一个是最大id。

现在,您可以在join中使用它来获取其余字段:

代码语言:javascript
运行
复制
select w.workshop_id, w.name, w.vat,
       (official_id is not null) as official
from (select w.vat, max(case when w.official = 1 then w.id end) as official_id,
             max(w.id) as max_id
      from workshop_manufacturer wm join
           workshop w
           on w.id = wm.workshop_id
      group by w.vat
     ) v join
     workshop w
     on w.id = coalesce(official_id, max_id);
票数 1
EN

Stack Overflow用户

发布于 2016-12-10 16:47:33

尝尝这个。

代码语言:javascript
运行
复制
SELECT t1.*,t2.* FROM workshop t1
INNER JOIN workshop_manufacturer t2 ON t1.id=t2.workshop_id 
GROUP bY t1.vat having t2.official = 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41077817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档