जुड़ने को बाएं से दाएं संसाधित किया जाता है (जब तक कि कोष्ठक अन्यथा निर्देशित न करें)। यदि आप LEFT JOIN
(या सिर्फ JOIN
, समान प्रभाव) एक उपयोगकर्ता को तीन किराने का सामान आपको 3 पंक्तियाँ मिलती हैं (1 x 3 ) यदि आप एक ही उपयोगकर्ता के लिए 4 फिशमार्केट में शामिल होते हैं, तो आपको 12 मिलते हैं (3 x 4 ) पंक्तियाँ, गुणा करना परिणाम में पिछली गणना, न कि जोड़ने इसके लिए, जैसा आपने उम्मीद की होगी।
इस प्रकार किराने का सामान और मछली बाजार के लिए यात्राओं को समान रूप से गुणा करना।
आप इसे इस तरह काम कर सकते हैं:
SELECT u.id
, u.account_balance
, g.grocery_visits
, f.fishmarket_visits
FROM users u
LEFT JOIN (
SELECT user_id, count(*) AS grocery_visits
FROM grocery
GROUP BY user_id
) g ON g.user_id = u.id
LEFT JOIN (
SELECT user_id, count(*) AS fishmarket_visits
FROM fishmarket
GROUP BY user_id
) f ON f.user_id = u.id
ORDER BY u.id;
एक या कुछ उपयोगकर्ताओं के लिए समेकित मान प्राप्त करने के लिए, सहसंबंधित उपश्रेणियां जैसे @Vince प्रदान किया गया ठीक है। एक संपूर्ण तालिका या उसके प्रमुख भागों के लिए, n-तालिकाओं को एकत्रित करना और परिणाम में शामिल होना एक बार अधिक कुशल है। . इस तरह, हमें किसी अन्य GROUP BY
. की भी आवश्यकता नहीं है बाहरी क्वेरी में।
grocery_visits
और fishmarket_visits
हैं NULL
उपयोगकर्ताओं के लिए संबंधित तालिकाओं में किसी भी संबंधित प्रविष्टि के बिना। अगर आपको 0
चाहिए इसके बजाय (या कोई मनमानी संख्या), COALESCE
. का उपयोग करें बाहरी में SELECT
:
SELECT u.id
, u.account_balance
, COALESCE(g.grocery_visits , 0) AS grocery_visits
, COALESCE(f.fishmarket_visits, 0) AS fishmarket_visits
FROM ...