2012-10-31 10 views
25

मैं एक भयानक विरासत डेटाबेस/कोडबेस का विश्लेषण कर रहा हूं, जो सर्वर लोड को कम करने के लिए सर्वर लोड को कम करने की कोशिश कर रहा है (आमतौर पर एक ईमेल अलर्ट क्रॉन जॉब समेत लाखों अलग-अलग प्रश्नों से अच्छी तरह से आमंत्रित करता है)।एक जॉइन में, तालिका के साथ सभी कॉलम नामों को उपसर्ग कैसे करें

SELECT * FROM 
class_alerts_holding ah 
INNER JOIN class_listings l ON l.id = ah.lid 
INNER JOIN class_users u ON u.id = ah.uid 
LEFT JOIN class_prodimages pi ON pi.pid = ah.lid 

यह 120 कॉलम बाहर थूक ...

aid | id | lid | uid | oid | catName | searchtext | alertfreq | listType | id | owner | title | section | shortDescription | description | featured | price | display | hitcount | dateadded | expiration | url | notified | searchcount | repliedcount | pBold | pHighlighted | notes | ... 

कैसे नई क्वेरी बनाने के तरीके के अपने विश्लेषण में मदद के लिए यह भयानक हो सकता है अगर मैं मेज के साथ परिणाम में स्तंभों उपसर्ग सकता है वे जॉइन उदाहरण में से आया था

class_alerts_holding.aid | class_alerts_holding.id | class_listings.lid | ... 

क्या यह हासिल करने का कोई तरीका है?

+1

मुझे डर है कि केवल संभावना को लिख रहा है कर रहा हूँ/मैन्युअल रूप से 'SELECT' कथन उत्पन्न करना –

+1

आपने मुझे लंबे समय तक Google को खोजने का कारण दिया है। मुझे इसके बारे में अतीत में भी रूचि है, लेकिन मुझे वास्तव में ऐसा करने के लिए कोई संभावित विधि नहीं मिली –

+0

[एसक्यूएल का चयन करें: संभावित कॉलम का चयन करें: क्या सभी कॉलम को 'उपसर्ग' \ * 'के रूप में उपसर्ग करना संभव है?] (http://stackoverflow.com/questions/329931/sql-select-join-is-it-possible-to-prefix-all-columns-as-prefix) –

उत्तर

18

आप

select ah.*, l.*, u.*, pi.* from ... 

फिर कॉलम तालिका तक कम से कम आदेश दिया लौटा दी जाएगी सकता है।

कॉलम के हर दो सेट के बीच बेहतर अंतर के लिए, आप भी "सीमांकक" कॉलम इस तरह जोड़ सकते हैं: (।, अनावश्यक रूप स्पष्ट उपनाम दूर करने के लिए टिप्पणियों को देखने के संपादित)

select ah.*, ':', l.*, ':', u.*, ':', pi.* from ... 

+1

* मेरे * प्रश्नों का विश्लेषण करते समय मैं अक्सर जो करता हूं उसे जोड़कर आपके सुझाव पर "विस्तार" की स्वतंत्रता लेता हूं। अगर आपको लगता है कि आपके उत्तर में कोई जगह नहीं है तो कृपया मेरे परिवर्तन को वापस रोल करने के लिए स्वतंत्र महसूस करें। –

+1

+1 डिलीमीटर निश्चित रूप से सहायक होते हैं, साथ ही ऑर्डरिंग को लागू करते हैं। यद्यपि कॉलम ऑर्डरिंग जॉइन (MySQL 5.5.25) के क्रम में पहले से ही दिखाई दे रहा है। –

+0

@AndriyM सिर्फ थोड़ी सी क्वेरी को सरल बनाने के लिए एक नोट: मैंने पाया कि 'AS' के बिना मुझे एक ही परिणाम मिला है उदा। 'चुनें आह। *,': ', एल। *,': ', ... ' –

32

आप अपनी क्वेरी में खेतों नाम दे सकते हैं और उन्हें उपनाम दे:

SELECT  ah.whateverfield1 AS 'ah_field1', 
      ah.whateverfield2 AS 'ah_field2', 
      l.whateverfield3 AS 'l.field3', 
      [....] 
FROM  class_alerts_holding ah 
INNER JOIN class_listings l ON l.id = ah.lid 
INNER JOIN class_users u ON u.id = ah.uid 
LEFT JOIN class_prodimages pi ON pi.pid = ah.lid 

इसका काम का एक सा मैन्युअल स्थापित करने के लिए करता है, तो आपको लगता है कि कई क्षेत्रों है, लेकिन आप इस क्वेरी के साथ इस सरल बना सकते हैं .. ।

SHOW FULL FIELDS FROM your_table_name; 

... और एक अच्छा पाठ संपादक और & कॉपी पेस्ट करें।

+8

... और स्वीकार्य उत्तर के विपरीत, यह वास्तव में मूल प्रश्न का उत्तर देता है! – nurdglaw

+7

तो टेबल पर जाने का कोई तरीका नहीं है। * तालिका के रूप में और तालिका से सभी कॉलम table.columnName के रूप में लौटाए गए हैं? – James111

+0

यदि आपका संपादक रेगेक्स ढूंढने का समर्थन करता है और प्रतिस्थापित करें, फिर आप इस पैटर्न के साथ प्रत्येक कॉलम नाम पा सकते हैं -> (?) (। *?), और वें के साथ प्रतिस्थापित करें पैटर्न है -> \ 1PREF। \ 2 AS PREF_ \ 2, – Teddy

8

डायनामिक रूप से कॉलम नाम देने का तरीका एक तैयार कथन उत्पन्न करना है जो info_schema का संदर्भ देता है। यह आपको वह परिणाम देगा जो आप खोज रहे थे।

SET @sql = NULL; 
SELECT CONCAT(
    'SELECT ',GROUP_CONCAT(c.TABLE_NAME,'.',c.COLUMN_NAME,' AS `',c.TABLE_NAME,'.',c.COLUMN_NAME,'`'),' 
    FROM class_alerts_holding 
    INNER JOIN class_listings ON class_listings.id = class_alerts_holding.lid 
    INNER JOIN class_users ON class_users.id = class_alerts_holding.uid 
    LEFT JOIN class_prodimages ON class_prodimages.pid = class_alerts_holding.lid' 
) 
INTO @sql 
FROM INFORMATION_SCHEMA.COLUMNS c 
WHERE c.TABLE_NAME IN ('class_alerts_holding','class_listings', 
         'class_users','class_prodimages');  
PREPARE sql_statement FROM @sql; 
EXECUTE sql_statement; 

group_concat() फ़ंक्शन तो अपने टेबल में स्तंभों की संख्या पर निर्भर करता है, आप तैयार बयान उत्पन्न करने के लिए इस सीमा को बढ़ाने की आवश्यकता हो सकती, 1024 वर्णों की एक डिफ़ॉल्ट सीमा होती है।

SET SESSION group_concat_max_len = 1000000; 

यह आदेश आवश्यक होने पर समूह समेकित सीमा को बढ़ाएगा। -

+1

क्या आप इसका आउटपुट का उदाहरण दे सकते हैं? –

+1

निश्चित बात यह है कि इस उदाहरण के साथ एक पहेली है, http://sqlfiddle.com/#!9/e99bf2/10। इसे एक साथ रखकर देखा गया कि आपको टेबल उपनाम निकालना होगा और एएस कथन शामिल करना होगा, इसलिए मैंने उनको शामिल करने के लिए संपादित किया है। फीडल कॉलम नामों को प्रदर्शित करने के बारे में अजीब लगता है। यह उदाहरण के लिए, पहले कॉलम के लिए केवल आईडी दिखाता है। लेकिन किसी भी अन्य ग्राहक में आप निर्दिष्ट 'class_alerts_holding.id' देखेंगे। –

+0

नीचे वोट के लिए खेद है, कुछ दिन पहले पृष्ठ के माध्यम से स्वाइप करते समय हुआ होगा :( → उत्तर को संपादित किए जाने तक उस वोट को नहीं बदला जा सकता है। –

2

समाधान koljaTM और AndriyM द्वारा प्रस्तावित के आधार पर, हो सकता है एक और भी बेहतर समाधान इस तरह आपकी क्वेरी लिखने के लिए:

select 
    '--TABLE_AAA:--', TABLE_AAA.*, 
    '--TABLE_BBB:--', TABLE_BBB.*, 
    '--TABLE_CCC:--', TABLE_CCC.*, 
    '--TABLE_DDD:--', TABLE_DDD.* 
from ... 

दुर्भाग्य से यह अभी भी मामलों में पर्याप्त नहीं है जब एक (या अधिक) तालिकाओं में स्क्रीन चौड़ाई पर फ़िट होने से अधिक कॉलम नाम होते हैं।(तो आप अपनी स्क्रीन पर 20 कॉलम देख सकते हैं लेकिन स्क्रीन पर अभी भी दिखाई नहीं दे रहे हैं, जिसकी तालिका वे आती हैं।)

एसक्यूएल ने कॉलम नामों को स्वचालित रूप से उपसर्ग करने का तरीका प्रदान किया है, तो यह अभी भी बेहतर होगा तालिका नाम के साथ ...

+2

पुन: स्क्रीन चौड़ाई- पोस्टस्ट्रेएसक्यूएल और माईएसक्यूएल शैल के पास एक लंबवत परिणाम मोड होता है जहां प्रत्येक मान को कॉलम के रूप में मुद्रित किया जाता है: मूल्य जोड़ी। पोस्टग्रेज़: विस्तार में स्विच करने के लिए खोल में '\ x' टाइप करें मोड। MySQL: ';' –

+0

की बजाय '\ G' के साथ क्वेरी समाप्त करें "यदि SQL ने तालिका नामों के साथ कॉलम नामों को स्वचालित रूप से उपसर्ग करने का तरीका प्रदान किया है तो यह अभी भी बेहतर होगा" +1 – Teddy

0

@ Alden-डब्ल्यू, आप जहां विभिन्न स्कीमा

से एक ही तालिका नामों को नहीं मिश्रण करने के लिए करने के लिए TABLE_SCHEMA हालत जोड़ सकते हैं
WHERE c.TABLE_SCHEMA='YOUR_SCHEMA_NAME' AND c.TABLE_NAME IN (....) 
संबंधित मुद्दे