显示器最高报价,但仍显示没有报价

问题描述:

我试图显示企业与他们的最高折扣优惠。但我仍然希望展示没有优惠的商家。显示器最高报价,但仍显示没有报价

企业都将存储在这些企业business_tb

business_id | business_name 
------------+--------------- 
    1  |  aaa 
    2  |  bbb 
    3  |  ccc 

提供的折扣都存储在deal_offer_tb

deal_offer_id | business_id | deal_id 
--------------+-------------+---------- 
     1  |  1  | 3 
     2  |  1  | 2 
     3  |  2  | 0 
     4  |  1  | 1 
     5  |  3  | 3 

和类型的折扣都存储在deal_tb

deal_id | discount 
--------+---------- 
    1 | 40% 
    2 | 30% 
    3 | 20% 
    4 | 10% 

,所以我想应该是这个样子显示:

1 | aaa | 40% 
2 | bbb | --- 
3 | ccc | 20% 

但我目前的查询:

SELECT a.business_id, a.business_name, c.discount 
    FROM business_tb a 
    LEFT JOIN (SELECT min(deal_id) AS deal_id, business_id FROM deal_offer_tb GROUP BY business_id) b ON a.business_id = b.business_id 
    LEFT JOIN deal_tb c ON b.deal_id = c.deal_id 

我只得到:

1 | aaa | 40% 
3 | ccc | 20% 

它不显示没有安全隐患的企业红色折扣。

我如何得到我想要的输出?


更新:我不知道前面发生了什么,但我的查询工作,我想它的方式。感谢那些回答的人的努力。欣赏它,大好时光!

+2

您的查询应该工作。 –

+0

@GordonLinoff - 是的,但它不显示企业没有提供折扣。 –

+0

我看不到'ccc'的'30%'来自哪里。根据'deal_offer_tb',商业3与交易3相关联,交易3提供20%。 – Manngo

我会通过使用子查询来找到每个企业的最大折扣,加入deal_offer_tbdeal_tb表。然后,将此子查询加入business_tb表以获得最终结果。请注意,我使用最初的LEFT JOIN来说明给定的业务可能甚至没有与之相关的交易。在这种情况下,我将该业务的最大折扣分配为0(这是合理的,因为那时全面的正常价格将适用)。

SELECT 
    t1.business_id, 
    t1.business_name, 
    COALESECE(t2.max_discount, 0) AS max_discount 
FROM business_tb t1 
LEFT JOIN 
(
    SELECT t1.business_id, MAX(t2.discount) AS max_discount 
    FROM deal_offer_tb t1 
    INNER JOIN deal_tb t2 
     ON t1.deal_id = t2.deal_id 
    GROUP BY t1.business_id 
) t2 
    ON t1.business_id = t2.business_id 
+0

编辑:是的。还是行不通。 'bbb'仍然不存在。 –

+0

@GrandMarshalBraev请再试一次。我没有意识到你有没有匹配交易的企业。使用初始的'LEFT JOIN'应该可以解决这个问题。 –

+0

* COALESCE。已更新的答案看起来很有希望 –

此查询实质上是您查询(用表的别名):

SELECT b.business_id, b.business_name, d.discount 
FROM business_tb b LEFT JOIN 
    (SELECT MIN(deal_id) AS deal_id, business_id 
     FROM deal_offer_tb dot 
     GROUP BY business_id 
    ) dot 
    ON b.business_id = dot.business_id LEFT JOIN 
    deal_tb d 
    ON d.deal_id = dot.deal_id; 

截至LEFT JOIN的定义,它会保持所有行business_tb,无论是否有在比赛FROM条款的其余部分。您没有其他过滤(通过WHERE)或聚合。因此,这应该返回business_tb中的所有行。

+0

“折扣”列位于“deal_tb”中,而不是“deal_offer_tb”(别名为“dot”)。但是,除了您使用的别名之外,我没有看到与当前查询有任何区别。 –

+0

@GrandMarshalBraev。 。 。 (感谢您收到'discount'。)这实质上是您的查询。通过'LEFT JOIN'的定义,它应该返回'business_tb'中的所有行。 –

+0

非常感谢!但是在检查我目前的查询后,它现在按我想要的方式工作。 –

下面是做查询的一种方法:

SELECT 
    a.business_id, a.business_name, b.max 
FROM business_tb a 
INNER JOIN (
    SELECT 
     c.business_id, MAX(d.discount) AS max 
    FROM deal_offer_tb c 
    LEFT JOIN deal_tb d ON c.deal_id = d.deal_id 
    GROUP BY c.business_id 
) b ON a.business_id = b.business_id; 

您不必在deal_tbdeal_id 0,所以我想这是对null 3. deal_offer_id