2017-03-08 10 views
0
SHOPS 
+----+------------+ 
| id | shop_name | 
+----+------------+ 

ORDERBOOKINGS 
+-----+---------+-------------+------------+ 
| id | shop_id | grand_total | created_at | 
+-----+---------+-------------+------------+ 

に(なし行)との結合条件を左に日付。私はそれがすべての店を返すことを望んでいる(それらの日付の間にある店舗の注文がない場合、total_ordersを持つものを0として返すべきである)。MySQLは、私はこのようなテーブルを取得したい右の表

注:一部のショップでは、注文表にもエントリがない場合があります。

私は次のことを試してみましたが、お店のテーブルからすべての行を返すことに失敗:

SELECT COUNT(orderbookings.id), 
     SUM(orderbookings.grand_total), 
     shops.shop_name 
FROM `orderbookings` 
LEFT JOIN shops 
    on orderbookings.shop_id = shops.id 
where orderbookings.created_at BETWEEN "2015-10-22 17:02:02" AND "2017-03-07 17:02:02" 
GROUP BY shops.id 

どのように私はこれを達成することができます任意のアイデアを。?

ありがとうございました。

答えて

1

クエリとRIGHT JOINからLEFT JOINandwhereを交換してください:

SELECT 
    COUNT(orderbookings.id), 
    COALESCE(SUM(orderbookings.grand_total), 0), 
    shops.shop_name 
FROM `orderbookings` 
RIHGT JOIN shops on orderbookings.shop_id = shops.id and orderbookings.created_at BETWEEN "2015-10-22 17:02:02" AND "2017-03-07 17:02:02" 
GROUP BY shops.id 

は説明:
1)あなたはすべてのお店を取得したい場合は、メインテーブルとしてshopsを使用する必要があり、その後、orderbookingsに参加し、左、ここで私はあなたがメインテーブルとしてorderbookingsを使用する右の結合理由を使用します。
2)whereorderbookingsの列を使用すると、左結合が内側結合として使用されます。

最後に、left join解決策はこれを好きになるでしょう:

SELECT 
    COUNT(orderbookings.id), 
    COALESCE(SUM(orderbookings.grand_total), 0), 
    shops.shop_name 
FROM `shops ` 
LEFT JOIN orderbookings on orderbookings.shop_id = shops.id and orderbookings.created_at BETWEEN "2015-10-22 17:02:02" AND "2017-03-07 17:02:02" 
GROUP BY shops.id 
+0

はすでに試してみました。 orderbookingsテーブルにエントリがある店舗のみが返されます。他のすべてのお店を出る。 –

+0

@ nikhil.malik私の答えを更新しました。もう一度それを確認してください。 – Blank

+0

現在動作中です。気高い! –

0

はあなたの参加と追加し、いくつかのIFNULLsを逆にする:

SELECT IFNULL(COUNT(orderbookings.id),0), 
     IFNULL(SUM(orderbookings.grand_total),0), 
     shops.shop_name 
FROM `orderbookings` 
RIGHT OUTER JOIN shops 
    on orderbookings.shop_id = shops.id 
     and orderbookings.created_at BETWEEN "2015-10-22 17:02:02" AND "2017-03-07 17:02:02" 
GROUP BY shops.id 
+1

'WHERE'条件を' ON'節に移動する必要があるかもしれません。 –

+0

ヘルプがありません。オーダーブッキングテーブルにオーダーのある店舗のみが返されます。他のすべてのお店を出る。私は本当のデータを提供したいですか? –

+0

おっと、ジョイン構文は少し錆びています。右外側の仲間を試してみてください。答えを更新しました。 – Ilion

関連する問題