2017-05-05 6 views
1

私は最高のディスカウントオファーと共にビジネスを表示しようとしています。しかし、私はまだ提供していないビジネスを表示したいと思います。最高のオファーを表示しますが、オファーなしでまだ表示しています

企業はこれらの事業によって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% 

それをオフのないビジネスを表示しない赤い割引。

希望の出力をどのように得ることができますか?


UPDATE:は、私が以前に何が起こったのかわからないが、私のクエリは、私はそれを望んでいた道を働いています。答えた人の努力に感謝します。それを感謝し、大きな時間!

+2

ためnullだと仮定します。 –

+0

@ GordonLinoff - はい、ただし割引なしの企業は表示されません。 –

+0

「ccc」の「30%」がどこから来るのか分かりません。「deal_offer_tb」によれば、ビジネス3はディール3に関連付けられ、ディール3は20%を与える。 – Manngo

答えて

1

私は副問合せを使用して、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 
+0

編集:うん。まだ動かない。 'bbb'はまだそこにはありません。 –

+0

@GrandMarshalBraevもう一度お試しください。私はあなたが一致する取引を持たないビジネスを持っていたことを理解していません最初のLEFT JOINを使用するとこの問題が解決されます。 –

+0

* COALESCE。更新された答えは有望です –

1

このクエリは、本質的に(表の別名を持つ)あなたのクエリです:

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

'discount'カラムは' deal_tb'にあり、 'deal_offer_tb'(エイリアスは' dot')ではありません。しかし、あなたが使用しているエイリアスを除いて、現在のクエリとの違いはありません。 –

+0

@GrandMarshalBraev。 。 。 (「割引」のキャッチに感謝します。)これは本質的にあなたの質問です。 LEFT JOINの定義によって、 'business_tb'のすべての行を返すはずです。 –

+0

ありがとうございます!しかし、私の現在のクエリをチェックすると、それは今私が望んでいた方法で動作しています。 –

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を持っていないので、私はそれはあなたのクエリが動作するはずdeal_offer_id 3.

関連する問題