显示器最高报价,但仍显示没有报价
我试图显示企业与他们的最高折扣优惠。但我仍然希望展示没有优惠的商家。显示器最高报价,但仍显示没有报价
企业都将存储在这些企业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%
它不显示没有安全隐患的企业红色折扣。
我如何得到我想要的输出?
更新:我不知道前面发生了什么,但我的查询工作,我想它的方式。感谢那些回答的人的努力。欣赏它,大好时光!
我会通过使用子查询来找到每个企业的最大折扣,加入deal_offer_tb
和deal_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
编辑:是的。还是行不通。 'bbb'仍然不存在。 –
@GrandMarshalBraev请再试一次。我没有意识到你有没有匹配交易的企业。使用初始的'LEFT JOIN'应该可以解决这个问题。 –
* 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
中的所有行。
“折扣”列位于“deal_tb”中,而不是“deal_offer_tb”(别名为“dot”)。但是,除了您使用的别名之外,我没有看到与当前查询有任何区别。 –
@GrandMarshalBraev。 。 。 (感谢您收到'discount'。)这实质上是您的查询。通过'LEFT JOIN'的定义,它应该返回'business_tb'中的所有行。 –
非常感谢!但是在检查我目前的查询后,它现在按我想要的方式工作。 –
下面是做查询的一种方法:
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_tb
deal_id
0,所以我想这是对null
3. deal_offer_id
您的查询应该工作。 –
@GordonLinoff - 是的,但它不显示企业没有提供折扣。 –
我看不到'ccc'的'30%'来自哪里。根据'deal_offer_tb',商业3与交易3相关联,交易3提供20%。 – Manngo