【问题标题】:Mysql group by and prefered field = 1 in join tableMysql group by 和preferred field = 1 in join table
【发布时间】:2016-12-10 16:41:10
【问题描述】:

我有车间有厂家,一个车间可以有很多厂家,但只有一个官方。我想获得所有拥有制造商 22 的车间,但如果他们有相同的大桶,则只获得制造商官方的车间

我有 2 张桌子,第一个研讨会

id | name          | vat
-------------------------
 1 | name 1        | B12
 2 | name 2        | B12
 3 | name 3        | B12
 4 | name 4        | E98
 5 | name 5        | A99

第二车间_制造商

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

我想获得独特的研讨会(按增值税分组),但如果有许多与该制造商合作的具有相同增值税的研讨会,我想获得官方的(官方=1)。

如果我做这个查询:

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

我明白了:

id | name    | vat  | official | manufacturer_id 
-----------------------------------------------
 1 | name 1  | B12  | 0       | 22
 4 | name 4  | E98  | 0       | 22
 5 | name 5  | A99  | 1       | 22

我想要这个:

id | name    | vat  | official | manufacturer_id 
-----------------------------------------------
 3 | name 3  | B12  | 1      | 22
 4 | name 4  | E98  | 0      | 22
 5 | name 5  | A99  | 1      | 22

所有官方和非官方的研讨会,但优先考虑官方的研讨会

【问题讨论】:

标签: php mysql group-by inner-join


【解决方案1】:

这是一个优先级,而不是一个聚合。但是比较复杂。

以下获取每个“vat”的研讨会的 ID:

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 中使用它来获取其余字段:

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);

【讨论】:

  • 通过这个查询,我只得到一个结果。我想参加所有的研讨会。我已经用更多信息编辑了我的问题。
  • @h3llr4iser 。 . .它缺少group by
【解决方案2】:

试试这个。

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

【讨论】:

  • 这里我只得到官方的,但我也需要非官方的
猜你喜欢
  • 2016-03-06
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多