【问题标题】:MySQL multiple "left join" and "having"MySQL 多重“左连接”和“拥有”
【发布时间】:2021-05-09 13:02:34
【问题描述】:

我有桌子:

1.Workers(id,name)

2.BonusPenalties(id,worker_id,type,worker_id,value)

3.Fouls(id,worker_id,value)

对于 BonusPenalties 列,“类型”可以是“0”或“1”,其中 0 - 是奖金,1 - 是罚款

所以我需要能够按奖金/处罚/犯规的数量过滤工人

类似where count(BonusPenalties.id) > 5(for penalties) and count(BonusPenalties.id) >7(for bonuses) and count(Fouls.id) < 100

我尝试通过左连接并使用“HAVING”来加入这些表,但结果出错

【问题讨论】:

  • 将表 2 和表 3 合并为一个表。为 type 列使用 ENUM 数据类型,有 3 个可能的值。
  • 但结果出错加入乘法?
  • @Akina,如果我将表 2 和表 3 合并,请您写加入示例

标签: mysql left-join counting having


【解决方案1】:

如果我将表 2 和表 3 合并,请编写加入示例

CREATE TABLE effects (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    worker_id INT NOT NULL,
    FOREIGN KEY fk_worker_id REFERENCES worker (worker_id),
    type ENUM('bonus', 'penalty', 'foul') NOT NULL,
    value DECIMAL(10, 2) NOT NULL DEFAULT 0
);

现在没有加入乘法,你可以使用类似的东西

HAVING SUM(type='bonus') > 2
   AND SUM(type='foul') = 0

HAVING SUM(type='bonus') > 2 -- check bonuses amount
   AND SUM(CASE WHEN type='foul' THEN value ELSE 0 END) < 1000 -- check total sum of fouls

在 GROUP BY 之后。

【讨论】:

  • 谢谢!现在我可以按惩罚和奖金过滤。但是,如果无法将犯规与罚金结合起来,我该怎么办
  • @Baurzhan 使用 UNION ALL 子查询进行数据转换(将犯规编码为,例如 type=2)。或者甚至是一个视图(如果执行速度不是问题的话)。例如...
猜你喜欢
  • 2010-12-31
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2011-12-22
  • 1970-01-01
  • 2017-08-22
  • 2018-08-21
相关资源
最近更新 更多