mysql 使用基于带“标志”的值的条件连接表

vyu0f0g1  于 2023-01-20  发布在  Mysql
关注(0)|答案(2)|浏览(112)

我有一个MySQL查询的问题。
假设我们有两个表:
汽车:
| 身份证|烙印|所有者标识|
| - ------|- ------|- ------|
| 1个|丰田|二十四|
| 第二章|浅滩|五十六|
| ...|...|...|
汽车债务:
| 身份证|价值|汽车标识(fk)|fl_unique(布尔值)|
| - ------|- ------|- ------|- ------|
| 二十四|50.0分|1个|无|
| 二十五|40岁|1个|无|
| 二十六|90分|1个|1个|
| 二十七|10.0分|第二章|无|
| 二十八|20.0年|第二章|无|
| 二十九|30岁|第二章|无|
| ...|...|...|...|
我想产生这样一个结果:
| 汽车_债务. id|汽车债务.价值|www.example.comcars.idcars.brand| car_debts.fl_unique(boolean) | cars.brand |
| - ------|- ------|- ------|- ------|- ------|
| 二十四|0.0分|1个|无|丰田|
| 二十五|0.0分|1个|无|丰田|
| 二十六|90分|1个|1个|丰田|
| 二十七|10.0分|第二章|无|浅滩|
| 二十八|20.0年|第二章|无|浅滩|
| 二十九|30岁|第二章|无|浅滩|
| ...|...|...|...|...|
因此,基本上查询结果时会考虑"fl_unique"标志。如果car_debts在某行中的"fl_unique"为真,则只应考虑具有该标志的值,其他值 必须为0.0。如果它们没有标记为true,则值不会发生任何变化。
这是我的问题的一个简单的抽象。感谢任何帮助或提示!

ssm49v7z

ssm49v7z1#

以下步骤可在this example上找到。
首先,通过查找哪个不同的car_id具有fl_unique true(0)开始,这可以通过使用以下来实现:

select car_id
from car_debts
group by car_id
having SUM(fl_unique <> 0)>0

我们可以使用连接和case表达式如下:

select cd.id,
       case when tbl.car_id is null then cd.value 
            when cd.fl_unique = 1 and tbl.car_id is not null then cd.value
            when fl_unique=0  and tbl.car_id is not null then  0.0 end as value,
       c.id,
       cd.fl_unique,
       c.brand,
       tbl.car_id
from car_debts cd
left join (select car_id
           from car_debts
           group by car_id
           having SUM(fl_unique <> 0)>0 
           ) tbl on tbl.car_id=cd.car_id
inner join cars c on c.id=cd.car_id;
  • 注意 * 与子查询的左联接有助于创建case条件。

如果car_id的所有组值(在示例2中)均为空,则按原样选择value

cngwdvgl

cngwdvgl2#

使用MAX()窗口函数获取每个car_idfl_unique最大值,并将其与fl_unique的当前值进行比较。
如果它们不相同,这意味着返回的value必须是0,否则是value

SELECT d.id,
       (MAX(d.fl_unique) OVER (PARTITION BY d.car_id) = d.fl_unique) * d.value AS value,
       d.car_id, 
       d.fl_unique,
       c.brand
FROM car_debts d INNER JOIN cars c
ON c.id = d.car_id;

请参见demo

相关问题