मेरे पास एक प्रश्न है जो मूडल में कुछ समूहों को लाता है:

select 
    g.id groupid, 
    g.name groupname, 
    count(distinct gm.userid)
from prefix_groups g
    left join prefix_groups_members gm on gm.groupid = g.id
group by g.id

उत्पादन

| groupid | groupname | count(distinct gm.userid) |
|---------|-----------|---------------------------|
| 1       | 20NEW-4A  | 6                         |
| 2       | 18PAR-5F  | 3                         |
| 3       | 20BER-6G  | 2                         |
| 4       | 50NEV-6G  | 6                         |
| 5       | 34HOG-5Q  | 77                        |
| 6       | 10BAT-GG  | 5                         |
| etc.    | etc.      | etc.                      |

मैं location नामक एक कॉलम जोड़ना चाहता हूं, जो समूह के स्थान को सूचीबद्ध करता है (इस प्लेटफॉर्म में समूहनाम मानक के अनुसार। जैसे बीईआर = बर्लिन)। मेरे पास फ़िल्टर करने के लिए इनमें से 100 से अधिक स्थान हैं। मुझे पता है कि मैं उन सभी को एक case स्टेटमेंट में फेंक सकता हूं और इसे बहुत लंबा दिन कह सकता हूं (जैसे नीचे), लेकिन मैं इसे सबसे कुशल तरीके से करना चाहता हूं। इस उदाहरण में, मैं ऐसा करने के लिए एक अस्थायी तालिका नहीं बना सकता। कोई विचार?

select 
    g.id groupid, 
    g.name groupname, 
    case when substring(g.name, 3, 3) = 'BER'
        then 'Berlin'
        when substring(g.name, 3, 3) = 'NEW'
        then 'Newcastle'
        -- etc.
    end location,
    count(distinct gm.userid)
from prefix_groups g
    left join prefix_groups_members gm on gm.groupid = g.id
group by g.id

आउटपुट:

| groupid | groupname | location  | count(distinct gm.userid) |
|---------|-----------|-----------|---------------------------|
| 1       | 20NEW-4A  | Newcastle | 6                         |
| 2       | 18PAR-5F  | Paris     | 3                         |
| 3       | 20BER-6G  | Berlin    | 2                         |
| 4       | 50NEV-6G  | Neverland | 6                         |
| 5       | 34HOG-5Q  | Hogwarts  | 77                        |
| 6       | 10BAT-GG  | Bath      | 5                         |
| etc.    | etc.      | etc.      | etc.                      |
0
Zectzozda 21 पद 2020, 09:34
g.name की पूरी सामग्री क्या है? हम केवल सबस्ट्रिंग देखते हैं
 – 
juergen d
21 पद 2020, 09:36
संबंध (कोड-स्थान) को अलग तालिका में सहेजें और इसे अपनी क्वेरी में शामिल करें।
 – 
Akina
21 पद 2020, 09:36
- g.name पहली क्वेरी के अनुसार ग्रुपनाम है और यह आउटपुट है।
 – 
Zectzozda
21 पद 2020, 09:41
@Akina, सुनिश्चित नहीं है कि आपने मेरी पोस्ट के इस भाग को याद किया है: In this instance, I cannot create a temporary table to do this.। यह यहाँ क्यों जाने लायक नहीं है, लेकिन मैं मूल रूप से इस क्वेरी को करने के लिए केवल select कथनों का उपयोग करने में बाधा हूँ।
 – 
Zectzozda
21 पद 2020, 09:43
उत्तर अपडेट किया गया।
 – 
Akina
21 पद 2020, 09:50

1 उत्तर

सबसे बढ़िया उत्तर
CREATE TABLE locations ( code CHAR(3), location VARCHAR(255) );

INSERT INTO locations VALUES ('BER', 'Berlin'), ('NEW', 'Newcastle'), ... ;

और फिर

select 
    g.id groupid, 
    g.name groupname, 
    locations.location,
    count(distinct gm.userid)
from prefix_groups g
left join prefix_groups_members gm on gm.groupid = g.id
LEFT JOIN locations ON substring(g.name, 3, 3) = locations.code
group by g.id, g.name, locations.location;

प्रदर्शन में सुधार के लिए आप उत्पन्न कॉलम को prefix_groups में जोड़ सकते हैं और इसमें शामिल होने की स्थिति में किसी फ़ंक्शन से बचने के लिए इसमें शामिल हो सकते हैं।


इस उदाहरण में, मैं एक अस्थायी तालिका नहीं बना सकता

यदि ऐसा है तो लंबे मामले से बचने के लिए आप एक अभिव्यक्ति का उपयोग कर सकते हैं जैसे:

ELT(FIND_IN SET(SUBSTRING(g.name, 3, 3), 'BER,NEW,...'), 'Berlin', 'Newcastle', ...) AS location

मुझे यकीन नहीं है कि यह अधिक प्रभावी होगा। लेकिन यह गारंटी के साथ छोटा होगा।

पुनश्च. आप CASE फ़ंक्शन के दूसरे प्रकार का उपयोग कर सकते हैं:

case substring(g.name, 3, 3) when 'BER' then 'Berlin'
                             when 'NEW' then 'Newcastle'
                             -- etc.
                             end location,
3
Akina 21 पद 2020, 09:49
substring(g.name, 1, 3) नहीं होना चाहिए?
 – 
FanoFN
21 पद 2020, 09:53
प्रश्न में मान उदाहरण देखें - पहले दो अंक अवश्य हटा दिए जाने चाहिए।
 – 
Akina
21 पद 2020, 09:54
मैं देखता हूँ, मेरा बुरा। मैंने संबंधित डेटा उदाहरण और इसके कामकाज के साथ पहेली में परीक्षण किया है। इस बहुत ही रोचक तरीके से +1!
 – 
FanoFN
21 पद 2020, 09:58
देर से उत्तर के लिए क्षमा करें। इसे उत्तर के रूप में चिह्नित करना। मुझे आपकी आखिरी पसंद (केस और सबस्ट्रिंग का उपयोग करके) सबसे आसान लगी। आपकी सहायता के लिए धन्यवाद!!
 – 
Zectzozda
4 फरवरी 2021, 04:27