12

LEFT JOINは、左側のテーブルのすべての行を表示する必要がありますが、次のクエリを実行すると、カウントが1以上の場所の値のみが取得されます。誰かが私がどこで間違っているのかについて私にいくつかのガイダンスを与えることができますか?

SELECT places.placeId,
       placeName,
       COUNT(orderId) AS orderCount
FROM   places
       LEFT JOIN orders
         ON places.placeId = orders.placeId
WHERE  places.companyId = 1
       AND stateId = 1
       AND orderstateId = 1
       AND orderName NOT LIKE 'Delivery%'
GROUP  BY places.placeId,
          places.placeName
ORDER  BY orderCount DESC,
          placeName ASC 

前もって感謝します

4

4 に答える 4

27

あなたの条件は、バックをにWHERE変換します。OUTER JOININNER JOIN

一致しない行はNULLすべての列に含まれ、句ordersによって削除されます。WHEREこれを試して。

SELECT places.placeId,
       placeName,
       COUNT(orderId) AS orderCount
FROM   places
       LEFT JOIN orders
         ON places.placeId = orders.placeId
       AND orders.stateId = 1
       AND orders.orderstateId = 1
       AND orders.orderName NOT LIKE 'Delivery%'
WHERE  places.companyId = 1
GROUP  BY places.placeId,
          places.placeName
ORDER  BY orderCount DESC,
          placeName ASC 
于 2012-10-01T14:41:01.673 に答える
1

これらの列、、、stateIDおよびorderstateIDOrderNameテーブルからORDERSのものである場合は、問題が発生します。ご覧のとおり、テーブルにplaces.placeID存在しない場合orders、次の列はテーブルnullsordersです。ordersそして、それがあなたがテーブルに提供した条件のためにいくつかのレコードが表示されない理由です。

于 2012-10-01T14:28:15.407 に答える
1

を使用する場合でも、すべての行が句LEFT JOINの条件を満たす必要があります。WHEREこの場合、WHERE句にはに関連する要件があるため、に一致しないorders行は返されません。ordersplaces

WHERE簡単な修正は、null値が句を満たすことを許可することです。

orderstateId = 1

に変更

(orderstateId is NULL or orderstateId = 1)

そして、他の変数についても同様です。

これはおそらくあなたが望むことをするでしょうが、ordersテーブルにnull値を持つ行が含まれ、結果を台無しにする可能性があるかどうかを確認する必要があります。別の方法でクエリを再設計する方がよい場合があります。

于 2012-10-01T14:35:04.667 に答える
0

あなたが言っているorderstateId = 1。これはにバインドされると思いorders.orderstateId = 1ます。orderstateIdこの条件は、一致せずに左結合したときに発生するnullの場合は失敗します。

に変更しますorders.orderstateId = 1 OR orders.orderstateId IS NULL

于 2012-10-01T14:27:35.133 に答える