एक निश्चित और ज्ञात कॉलम के साथ, यह कैसे करना है (मैंने टेबल को "ग्रेड" नाम देने की स्वतंत्रता ली):
सामान्य विचार:
विभिन्न प्रश्नों का एक संघ बनाने और इसे निष्पादित करने के लिए।
चूंकि आपको कॉलम हेडर के रूप में वास्तविक डेटा की आवश्यकता है, इसलिए संघ का पहला भाग ऐसा दिखेगा:
SELECT 'id', '1', '2', ....
वह क्वेरी अकेले परिणाम की नकल करेगी, इसलिए हमें MySQL को बताना होगा कि हमें LIMIT 0, 0
जोड़कर 0 पंक्तियों की आवश्यकता है ।
संघ की हमारी पहली पंक्ति में 'Name'
होगा , साथ ही तालिका के "नाम" कॉलम के सभी डेटा। उस पंक्ति को प्राप्त करने के लिए हमें एक प्रश्न की आवश्यकता है जैसे:
SELECT 'Name',
(SELECT Name FROM grades LIMIT 0, 1),
(SELECT Name FROM grades LIMIT 1, 1),
(SELECT Name FROM grades LIMIT 2, 1),
...
उसी तर्क का प्रयोग करते हुए, हमारी दूसरी पंक्ति इस तरह दिखेगी:
SELECT 'Marks',
(SELECT Marks FROM grades LIMIT 0, 1),
(SELECT Marks FROM grades LIMIT 1, 1),
(SELECT Marks FROM grades LIMIT 2, 1),
...
हेडर प्राप्त करना:
हमें MySQL से एक पंक्ति बनाने की आवश्यकता है जैसे:
SELECT 'id', '1', '2', ... LIMIT 0, 0;
उस लाइन को प्राप्त करने के लिए हम उपयोग करेंगे CONCAT()ए> और GROUP_CONCAT() कार्य:
SELECT 'id',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades)
LIMIT 0, 0;
और हम उस लाइन को एक नए वेरिएबल में स्टोर करने जा रहे हैं:
SET @header = CONCAT('SELECT \'id\', ',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades),
' LIMIT 0, 0');
पंक्तियां बनाना:
हमें निम्नलिखित की तरह दो प्रश्न बनाने होंगे:
SELECT 'Name',
(SELECT Name FROM grades LIMIT 0, 1),
(SELECT Name FROM grades LIMIT 1, 1),
(SELECT Name FROM grades LIMIT 2, 1),
...
चूँकि हम पहले से नहीं जानते हैं कि हमारी मूल तालिका में कितनी पंक्तियाँ हैं, हम भिन्न LIMIT x, 1
उत्पन्न करने के लिए चर का उपयोग करेंगे। बयान। उन्हें निम्नलिखित का उपयोग करके उत्पादित किया जा सकता है:
SET @a = -1;
SELECT @a:[email protected]+1 FROM grades;
इस स्निपेट का उपयोग करके, हम अपनी सबक्वेरी बना सकते हैं:
SELECT GROUP_CONCAT(
CONCAT(' (SELECT name FROM grades LIMIT ',
@a:[email protected]+1,
', 1)')
)
FROM grades
जिसे हम पहले कॉलम डेटा (जो दूसरे कॉलम का नाम है) के साथ एक वैरिएबल नाम @line1 में डालेंगे:
SET @a = -1;
SET @line1 = CONCAT(
'SELECT \'Name\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Name FROM grades LIMIT ',
@a:[email protected]+1,
', 1)')
)
FROM grades
));
इसी तर्क का पालन करते हुए दूसरी पंक्ति होगी:
SET @a := -1;
SET @line2 = CONCAT(
'SELECT \'Marks\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Marks FROM grades LIMIT ',
@a:[email protected]+1,
', 1)')
)
FROM grades
));
उन सभी को मिलाकर:
हमारे तीन चरों में अब शामिल हैं:
@header:
SELECT 'id', '1', '2' LIMIT 0, 0
@line1:
SELECT 'Name', (SELECT Name FROM grades LIMIT 0, 1),
(SELECT name FROM grades LIMIT 1, 1)
@line2:
SELECT 'Marks', (SELECT Marks FROM grades LIMIT 0, 1),
(SELECT marks FROM grades LIMIT 1, 1)
हमें केवल CONCAT()
. का उपयोग करके एक अंतिम चर बनाने की आवश्यकता है , इसे एक नई क्वेरी के रूप में तैयार करें और इसे निष्पादित करें:
SET @query = CONCAT('(',
@header,
') UNION (',
@line1,
') UNION (',
@line2,
')'
);
PREPARE my_query FROM @query;
EXECUTE my_query;
संपूर्ण समाधान:
(परीक्षण और संदर्भ के लिए):
SET @header = CONCAT('SELECT \'id\', ',
(SELECT GROUP_CONCAT(CONCAT(' \'', id, '\'')) FROM grades),
' LIMIT 0, 0');
SET @a = -1;
SET @line1 = CONCAT(
'SELECT \'Name\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Name FROM grades LIMIT ',
@a:[email protected]+1,
', 1)')
)
FROM grades
));
SET @a := -1;
SET @line2 = CONCAT(
'SELECT \'Marks\',',
(
SELECT GROUP_CONCAT(
CONCAT(' (SELECT Marks FROM grades LIMIT ',
@a:[email protected]+1,
', 1)')
)
FROM grades
));
SET @query = CONCAT('(',
@header,
') UNION (',
@line1,
') UNION (',
@line2,
')'
);
PREPARE my_query FROM @query;
EXECUTE my_query;
आउटपुट:
+-------+------+-------+ | id | 1 | 2 | +-------+------+-------+ | Name | Ram | Shyam | | Marks | 45 | 87 | +-------+------+-------+ 2 rows in set (0.00 sec)
समापन विचार:
-
मुझे अभी भी यकीन नहीं है कि आपको पंक्तियों को कॉलम में बदलने की आवश्यकता क्यों है, और मुझे यकीन है कि मैंने जो समाधान प्रस्तुत किया है वह सबसे अच्छा नहीं है (प्रदर्शन के मामले में)।
-
आप मेरे समाधान को एक शुरुआत के रूप में भी उपयोग कर सकते हैं और इसे एक सामान्य उद्देश्य समाधान के लिए अनुकूलित कर सकते हैं जहां तालिका कॉलम नाम (और पंक्तियों की संख्या) ज्ञात नहीं हैं,
information_schema
का उपयोग करके .COLUMNS
एक स्रोत के रूप में, लेकिन मुझे लगता है कि यह अभी बहुत दूर जा रहा है। -
मेरा दृढ़ विश्वास है कि मूल तालिका को एक सरणी में रखना और फिर उस सरणी को घुमाना बेहतर है, इस प्रकार डेटा को वांछित प्रारूप में प्राप्त करना।