Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

शामिल होने के साथ सही गिनती प्राप्त करने में समस्या

मुझे लगता है कि आप जो करने का प्रयास कर रहे हैं, उसके लिए सबसे सरल दृष्टिकोण केवल सहसंबद्ध उप प्रश्नों का उपयोग करना है।

तो, नीचे दिया गया पहला उदाहरण आपके द्वारा खोजे जा रहे परिणाम देता है . शून्य लक्ष्यों और सहायता वाली पंक्तियों को बाहर करने के लिए आप इसे आसानी से संशोधित कर सकते हैं।

यह प्रत्येक सबक्वेरी में team_id मान का उपयोग करता है, लेकिन आप इसे एक चर या पैरामीटर के साथ आपूर्ति कर सकते हैं, जैसा कि दिखाया गया है, ताकि आपको केवल एक बार मान निर्दिष्ट करने की आवश्यकता हो:

set @team_id := 2;

select
    p.id as player_id
    , p.last_name
    , (
        select count(*)
        from goals
        where player_id = p.id
        and team_id = @team_id
    ) as goals
    , (
        select count(*)
        from assists
        inner join goals on assists.goal_id = goals.id
        where assists.player_id = p.id
        and goals.team_id = @team_id
    ) as assists
from players p

टीम 1 के लिए:

+----+-----------+-------+---------+
| id | last_name | Goals | Assists |
+----+-----------+-------+---------+
|  1 | Gretzky   |     2 |       1 |
|  2 | Lemieux   |     0 |       0 |
|  3 | Messier   |     1 |       1 |
+----+-----------+-------+---------+

टीम 2 के लिए:

+----+-----------+-------+---------+
| id | last_name | Goals | Assists |
+----+-----------+-------+---------+
|  1 | Gretzky   |     0 |       0 |
|  2 | Lemieux   |     1 |       0 |
|  3 | Messier   |     0 |       0 |
+----+-----------+-------+---------+

टीम 3 के लिए:

+----+-----------+-------+---------+
| id | last_name | Goals | Assists |
+----+-----------+-------+---------+
|  1 | Gretzky   |     0 |       1 |
|  2 | Lemieux   |     0 |       0 |
|  3 | Messier   |     1 |       0 |
+----+-----------+-------+---------+

उपसंहार

कम सबक्वेरी और/या समग्र क्वेरी के साथ ऐसा करने की कोशिश करने के दृष्टिकोण से, आपके पहले प्रयास में कुछ समस्याएं हैं।

एक समस्या यह है कि यदि आप अपने group by में सभी फ़ील्ड शामिल नहीं करते हैं, तो संभवतः आपकी क्वेरी ठीक से काम नहीं करेगी खंड, भले ही MySQL आप पर उस तरह की (अधिकांश?)

साथ ही, क्योंकि आपके असिस्ट और प्लेयर टेबल दोनों में रिकॉर्ड केवल परोक्ष रूप से लक्ष्य तालिका के माध्यम से टीमों से संबंधित हैं, दोनों लक्ष्यों पर एक स्वतंत्र रोलअप प्राप्त करना बहुत कठिन है और केवल एक प्रश्न के साथ सहायता करता है।

एक उदाहरण के रूप में, इस पर मेरे पहले त्वरित शॉट सहित अन्य शुरुआती उत्तरों में कुछ समस्याएं थीं:

  • यदि किसी खिलाड़ी ने किसी टीम के लिए सहायता की थी, लेकिन उस टीम के लिए कोई लक्ष्य नहीं था, तो क्वेरी उस खिलाड़ी और टीम संयोजन के लिए कोई परिणाम नहीं लौटा सकी। परिणाम अधूरे थे।

  • यदि किसी खिलाड़ी के पास किसी टीम के लिए लक्ष्य थे, लेकिन उस टीम के लिए कोई सहायता नहीं थी, तो क्वेरी अभी भी सहायता के लिए एक सकारात्मक संख्या लौटाएगी, जब उन्हें शून्य वापस करना चाहिए था। परिणाम वास्तव में गलत थे, केवल अधूरे नहीं थे

नीचे थोड़ा और सही है, लेकिन अभी भी अधूरा समाधान है। यह सही ढंग से इंगित करता है कि अगर किसी खिलाड़ी के पास कोई सहायता नहीं है, भले ही वह 0 के बजाय शून्य लौटाता है जो दुर्भाग्यपूर्ण है।

लेकिन यह अभी भी एक आंशिक समाधान है क्योंकि अगर किसी खिलाड़ी के पास टीम के लिए कोई लक्ष्य नहीं है, तब भी आपको उस खिलाड़ी और टीम संयोजन के लिए कोई सहायता नहीं दिखाई देगी।

यह एक वर्चुअल टेबल के रूप में एक सबक्वायरी का उपयोग करता है जो प्रति खिलाड़ी और टीम को सहायता प्रदान करता है, और बाएं बाहरी सबक्वायरी में शामिल होता है जो लक्ष्य होने पर परिणाम देता है, लेकिन कोई सहायता नहीं करता है।

select
    p.id as player_id
    , p.last_name
    , count(g.game_id) as goals
    , a.assists
from players p
inner join goals g on p.id = g.player_id
left join (
    select
        assists.player_id
        , goals.team_id
        , count(assists.id) as assists
    from assists
    inner join goals on assists.goal_id = goals.id
    group by player_id, team_id, assists.id
) a
on g.player_id = a.player_id and g.team_id = a.team_id
where g.team_id = 1
group by player_id, last_name, g.team_id

वह क्वेरी ये परिणाम लौटाती है:

+----+-----------+-------+---------+
| id | last_name | Goals | Assists |
+----+-----------+-------+---------+
|  1 | Gretzky   |     2 |       1 |
|  3 | Messier   |     1 |       1 |
+----+-----------+-------+---------+

टीम 2 के लिए इसे चलाएँ, और आपको ये अगले परिणाम मिलते हैं, यह दर्शाता है कि टीम 2 के लिए Lemieux के पास कोई सहायता नहीं है, लेकिन अन्य दो खिलाड़ियों के लिए कोई परिणाम नहीं लौटा रहा है, जिनके पास टीम 2 के लिए कोई सहायता और कोई लक्ष्य नहीं है:

+----+-----------+-------+---------+
| id | last_name | Goals | Assists |
+----+-----------+-------+---------+
|  2 | Lemieux   |     1 |    null |
+----+-----------+-------+---------+

अंत में, इसे टीम 3 के लिए चलाएं, और आपको ये अगले परिणाम मिलते हैं, जो दर्शाता है कि मेसियर के पास टीम 3 के लिए कोई सहायता नहीं है। लेकिन ग्रेट्ज़की गायब है, भले ही उसके पास टीम 3 के लिए एक सहायता है, क्योंकि उसके पास नहीं है कोई भी लक्ष्य टीम 3 के लिए। इसलिए समाधान पूरा नहीं हुआ है:

+----+-----------+-------+---------+
| id | last_name | Goals | Assists |
+----+-----------+-------+---------+
|  3 | Messier   |     1 |    null |
+----+-----------+-------+---------+



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डैश के साथ MySQL स्कीमा नाम मुझे कमांड लाइन क्वेरी निष्पादित करने की अनुमति नहीं देता है

  2. mysql IS NOT NULL . के लिए काम नहीं कर रहा है

  3. नेटसुइट माइग्रेशन

  4. चयनित बिंदु से विशिष्ट दूरी पर सभी पतों को खोजने का सबसे अच्छा तरीका क्या है?

  5. PHP कनवर्टिंग दिनांक स्वरूप