यह एक एक साधारण समस्या लगती है, लेकिन मैं इसे एक भी का चयन करें या नेस्ट का चयन में काम नहीं कर सकता। पेपर (आलेख) के एक पंक्ति में लेखकों और (यदि कोई हैं) सलाहकार पुनर्प्राप्त करें।mysql 5 (5.1.42) में एकाधिक स्तंभ सबसिलेक्ट
मैं इस समस्या की व्याख्या करने के आदेश, यहाँ दो डेटा तालिकाओं (छद्म)
papers (id, title, c_year)
persons (id, firstname, lastname)
के साथ साथ एक लिंक तालिका w/एक अतिरिक्त विशेषता (छद्म) कर रहे हैं:
paper_person_roles(
paper_id
person_id
act_role ENUM ('AUTHOR', 'ADVISER')
)
यह मूलतः है और कर्मचारियों की एक सूची और/या छात्रों: लिखित कागजात (कागजात तालिका) की एक सूची (टेबल: व्यक्तियों)
एक लेख अपने (1, एन) लेखकों की है।
एक लेख में (0, एन) सलाहकार हो सकते हैं।
कोई व्यक्ति 'लेखक' या 'सलाहकार' भूमिका में हो सकता है (लेकिन एक ही समय में नहीं)।
आवेदन अंत में डालता तालिका निम्नलिखित प्रविष्टियों युक्त पंक्तियों:
चयन/आवेदन में लेख की एक पूरी सूची निकालने, जैसे:
TH: || Paper_ID | Author(s) | Title | Adviser(s) | TD: || 21334 |John Doe, Jeff Tucker|Why the moon looks yellow|Brown, Rayleigh| ...
मेरा पहला दृष्टिकोण की तरह था।
SELECT
q.id, q.title
FROM
papers AS q
ORDER BY
q.c_year
और क्वेरी के परिणामों को एक सरणी (एप्लिकेशन में) में सहेजें। इस कदम है, लौटे जानकारी के सरणी पर पाश के बाद और, लेखकों और सलाहकारों (यदि हो तो) को पुनः प्राप्त करने के लिए तैयार बयान के माध्यम से लिंक तालिका तरह से (कागज की आईडी है?): APPLICATION_LOOP(paper_ids in array)
SELECT
p.lastname, p.firstname, r.act_role
FROM
persons AS p, paper_person_roles AS r
WHERE
p.id=r.person_id AND r.paper_id = ?
# The application does further processing from here (pseudo):
foreach record from resulting records
if record.act_role eq 'AUTHOR' then join to author_column
if record.act_role eq 'ADVISER' then join to avdiser_column
end
print id, author_column, title, adviser_column
APPLICATION_LOOP
यह अब तक काम करता है और देता है वांछित आउटपुट। क्या यह को गणना को डीबी में वापस रखने के लिए समझ में आएगी? मैं नॉनट्रिविअल एसक्यूएल में बहुत कुशल नहीं हूं और एक एकल (संयुक्त या नेस्टेड) चयन कॉल के साथ समाधान नहीं ढूंढ सकता। मैं ने कोशिश की sth।
SELECT
q.title
(CONCAT_WS(' ',
(SELECT p.firstname, p.lastname AS aunames
FROM persons AS p, paper_person_roles AS r
WHERE q.id=r.paper_id AND r.act_role='AUTHOR')
)
) AS aulist
FROM
papers AS q, persons AS p, paper_person_roles AS r
कई भिन्नताओं में, लेकिन कोई भाग्य नहीं ... शायद कुछ मौका है?
अग्रिम धन्यवाद
आरबी।
पीटर, आपका उत्तर अविश्वसनीय है। यह वास्तव में * काम करता है, मुझे केवल वांछित आउटपुट (केवल सलाहकारों का अंतिम नाम) प्राप्त करने के लिए सलाहकार से आंतरिक कंकैट (..) को हटाना पड़ा। डेटाबेस बहुत बड़ा नहीं है (अब तक), इसलिए इन एकाधिक जोड़ों में प्रतिक्रिया एक सेकंड के 1/10'th से कम है। यदि कोई सलाहकार वापस नहीं आया है तो कोई रिक्त स्थान डालने का तरीका जानने का प्रयास करेगा (पूर्ण फ़ील्ड लौटाया गया)। बहुत बहुत धन्यवाद! –
आपका स्वागत है :) 'NULL' के बजाय रिक्त स्थान डालने के लिए, आप' COALESCE (p_aut.aut_name, '') ' –
ठीक से उपयोग कर सकते हैं, मैंने आपके उत्तर से बहुत कुछ सीखा। अब मुझे तालिकाओं में पूर्ण सक्षम गुणों को रखने में कुछ विश्वास है (गैर मौजूद पहले- और मध्य नामों के लिए) - क्योंकि केवल तब Concat/Group_Concat फ़ंक्शंस बिना पोस्टप्रोकैसिंग के उपयोगी परिणाम प्रदान करेंगे। बीटीडब्ल्यू। मैंने अस्थायी रूप से उत्पादन वातावरण में क्वेरी का परीक्षण किया और प्रतिक्रिया समय पूर्व "प्रक्रियात्मक" समाधान की तुलना में कम हो गया था। धन्यवाद और शुभ रात्रि –