मैंने सोचा कि मुझे समझ में आया कि बाहरी कैसे काम करता है, लेकिन मेरे पास ऐसी स्थिति है जो काम नहीं कर रही है, और मुझे 100% यकीन नहीं है कि जिस तरह से मेरी क्वेरी संरचित है, गलत है या अगर यह एक डेटा मुद्दा है।काम करने के लिए बाएं बाहरी जॉइन में समस्याएं
पृष्ठभूमि के लिए, मैं निम्नलिखित MySQL तालिका संरचना है:
mysql> describe achievement;
+-------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+-------+
| id | varchar(64) | NO | PRI | NULL | |
| game_id | varchar(10) | NO | PRI | NULL | |
| name | varchar(64) | NO | | NULL | |
| description | varchar(255) | NO | | NULL | |
| image_url | varchar(255) | NO | | NULL | |
| gamerscore | smallint(5) unsigned | NO | | 0 | |
| hidden | tinyint(1) | NO | | 0 | |
| base_hidden | tinyint(1) | NO | | 0 | |
+-------------+----------------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
और
mysql> describe gamer_achievement;
+----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------+------+-----+---------+-------+
| game_id | varchar(10) | NO | PRI | NULL | |
| achievement_id | varchar(64) | NO | PRI | NULL | |
| gamer_id | varchar(36) | NO | PRI | NULL | |
| earned_epoch | bigint(20) unsigned | NO | | 0 | |
| offline | tinyint(1) | NO | | 0 | |
+----------------+---------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
डेटा के रूप में, यह मैं यहाँ क्या आबादी है (केवल प्रासंगिक कॉलम संक्षिप्तता के लिए शामिल है) :
+----+------------+------------------------------+
| id | game_id | name |
+----+------------+------------------------------+
| 1 | 1480656849 | Cluster Buster |
| 2 | 1480656849 | Star Gazer |
| 3 | 1480656849 | Flower Child |
| 4 | 1480656849 | Oyster-meister |
| 5 | 1480656849 | Big Cheese of the South Seas |
| 6 | 1480656849 | Hexic Addict |
| 7 | 1480656849 | Collapse Master |
| 8 | 1480656849 | Survivalist |
| 9 | 1480656849 | Tick-Tock Doc |
| 10 | 1480656849 | Marathon Mogul |
| 11 | 1480656849 | Millionaire Extraordinaire |
| 12 | 1480656849 | Grand Pearl Pooh-Bah |
+----+------------+------------------------------+
12 rows in set (0.00 sec)
और
+----------------+------------+--------------+---------+
| achievement_id | game_id | earned_epoch | offline |
+----------------+------------+--------------+---------+
| 1 | 1480656849 | 0 | 1 |
| 2 | 1480656849 | 0 | 1 |
| 3 | 1480656849 | 0 | 1 |
| 4 | 1480656849 | 1149789371 | 0 |
| 7 | 1480656849 | 1149800406 | 0 |
| 8 | 1480656849 | 0 | 1 |
| 9 | 1480656849 | 1149794790 | 0 |
| 10 | 1480656849 | 1149792417 | 0 |
+----------------+------------+--------------+---------+
8 rows in set (0.02 sec)
इस विशेष मामले में, achievement
तालिका "मास्टर" तालिका है और इसमें वह जानकारी होगी जो मैं हमेशा देखना चाहता हूं। gamer_achievement
तालिका में केवल उन उपलब्धियों के लिए जानकारी शामिल है जो वास्तव में अर्जित की जाती हैं। किसी विशेष गेमर के लिए किसी भी विशेष गेम के लिए, gamer_achievement
तालिका में कई पंक्तियां हो सकती हैं - जिनमें कोई भी गेम नहीं है, तो उस गेम के लिए कोई उपलब्धियां अर्जित नहीं की गई हैं। उदाहरण के लिए, उपरोक्त नमूना डेटा में, आईडी 5, 6, 11, और 12 के साथ उपलब्धियां अर्जित नहीं की गई हैं।
मैं वर्तमान में क्या लिखा है
select a.id,
a.name,
ga.earned_epoch,
ga.offline
from achievement a
LEFT OUTER JOIN gamer_achievement ga
ON (a.id = ga.achievement_id and a.game_id = ga.game_id)
where ga.gamer_id = 'fba8fcaa-f57b-44c6-9431-4ab78605b024'
and a.game_id = '1480656849'
order by convert (a.id, unsigned)
है लेकिन यह केवल उन उपलब्धियों है कि वास्तव में अर्जित की है के लिए पूरी जानकारी लौटा रहा है - सही साइड टेबल से अनर्जित उपलब्धि जानकारी (gamer_achievement
) शो किया जा रहा है नल मूल्यों के साथ मैं इस प्रकार की क्वेरी से अपेक्षा करता हूं। यही वह है जिसे मैं देखने की उम्मीद कर रहा हूं:
+----+-------------------------------+--------------+---------+
| id | name | earned_epoch | offline |
+----+-------------------------------+--------------+---------+
| 1 | Cluster Buster | 0 | 1 |
| 2 | Star Gazer | 0 | 1 |
| 3 | Flower Child | 0 | 1 |
| 4 | Oyster-meister | 1149789371 | 0 |
| 5 | Big Cheese of the South Seas | NULL | NULL |
| 6 | Hexic Addict | NULL | NULL |
| 7 | Collapse Master | 1149800406 | 0 |
| 8 | Survivalist | 0 | 1 |
| 9 | Tick-Tock Doc | 1149794790 | 0 |
| 10 | Marathon Mogul | 1149792417 | 0 |
| 11 | Millionaire Extraordinaire | NULL | NULL |
| 12 | Grand Pearl Pooh-Bah | NULL | NULL |
+----+-------------------------------+--------------+---------+
12 rows in set (0.00 sec)
मुझे यहां क्या याद आ रही है? जो मैं समझता हूं, मूलभूत क्वेरी मेरे लिए सही है, लेकिन मुझे स्पष्ट रूप से महत्वपूर्ण जानकारी का कुछ टुकड़ा याद आ रहा है।
+1 अच्छा विस्तृत प्रश्न ..... – ManseUK