5

सबसे पहले, मैं लंबाई के लिए क्षमा चाहता हूं। यह जटिल है (कम से कम मेरे लिए)। डेटाबेस परजटिल MySQL डेटा संरचना/मैनिपुलेशन समस्या

पृष्ठभूमि:

मैं एक उत्पाद, चर, और कीमतों तालिका है। "उत्पाद" उत्पाद (विवरण, शीर्षक, आदि) के बारे में मुख्य जानकारी हैं। "कीमतों" में प्रत्येक मूल्य (मूल्य, लागत, न्यूनतम qty आवश्यक, शिपिंग लागत इत्यादि) के बारे में जानकारी होती है, क्योंकि कुछ उत्पादों में एक से अधिक मूल्य हो सकते हैं (उदाहरण के लिए 10 "विजेट 12 से अधिक विजेट" विजेट है) । "वेरिएबल्स" उस उत्पाद में भिन्नताएं हैं जो कीमत, जैसे रंग, आकार इत्यादि नहीं बदलती हैं

प्रारंभ में (जब मैंने 7 साल पहले इस डेटाबेस को बनाया था) मेरे पास पहली कीमत में संग्रहीत चर जानकारी थी एक पाइप-सीमित प्रारूप में एक ही उत्पाद के लिए कीमतों की एक सूची (हाँ, मुझे पता है, Badbadbad)। यह सामान्य रूप से काम करता था, लेकिन हमें हमेशा एक समस्या होती है, हालांकि, कभी-कभी एक चर सभी कीमतों के बीच संगत नहीं होगा।

उदाहरण के लिए, एक विजेट (उत्पाद) 10 "या 12" हो सकता है और क्रमश: $ 10 और $ 20 (कीमतें) के लिए बेच सकता है। हालांकि, जबकि 10 "विजेट नीले और लाल (चर) में उपलब्ध हो सकता है, 12" विजेट केवल लाल रंग में उपलब्ध है। हमने असंगत चर में "रेड (10" केवल) "जैसे छोटे पैतृक कथन को जोड़कर इस समस्या को सुधार दिया। इस प्रकार के काम, लेकिन ग्राहक हमेशा स्मार्ट नहीं होते हैं और जब ग्राहक चुनते हैं तो गलतियों को ठीक करने के लिए बहुत समय समर्पित होता है एक 12 "लाल रंग में विजेट।

मुझे तब से डेटाबेस का आधुनिकीकरण करने के लिए काम सौंपा गया है और उन्होंने चर को अपने स्वयं के टेबल में रखने और कुछ कीमतों के साथ मिलान करने के लिए और अधिक गतिशील और आसान बनाने का फैसला किया है, साथ ही साथ अधिक डमी-सबूत सूची (आप कर सकते हैं दुःस्वप्न की कल्पना नहीं है)।

मेरा पहला कदम सभी मौजूदा चरों को एक नई चर तालिका (और लेबल तालिका में संसाधित करने के लिए मेरे परीक्षण डीबी (जब मैं रूपांतरण करता हूं) पर संग्रहीत प्रक्रिया लिखना था, लेकिन यह वास्तव में महत्वपूर्ण नहीं है, मैं नहीं करता हूं ' टी सोचो)। मैंने प्रभावी रूप से चर को बाहर निकाला और उन्हें सही उत्पाद आईडी और उत्पाद आईडी के साथ सूचीबद्ध किया, जिसे वे प्रारंभिक रूप से परिवर्तनीय तालिका में जुड़े थे। हालांकि, मुझे एहसास हुआ कि यह केवल समस्या का एक हिस्सा है, क्योंकि मैं (कम से कम डेटाबेस के प्रारंभिक परिवर्तन के लिए) प्रत्येक चर को किसी दिए गए उत्पाद के लिए प्रत्येक मूल्य से कनेक्ट होने के रूप में सूचीबद्ध करना चाहता हूं। एक कई-से-अनेक चर तालिका के साथ

 
tblvariablesprices 
variablepriceid | variableid | priceid | productid 

है जो:

ऐसा करने के लिए, मैं एक तालिका बनाई गई है, इसलिए पसंद है।

समस्याएं:

मेरे समस्या अब है, मैं पंक्तियों को बनाने का तरीका पता नहीं है। मैं सभी आवश्यक डेटा प्राप्त करने के लिए अपनी कीमतों और चर सारणी पर बाएं जुड़ सकता हूं (मुझे लगता है), मुझे नहीं पता कि इसके माध्यम से कैसे जाना है। मेरे एसक्यूएल (mysql 5.0) है:

SELECT p.priceid, p.productid, variableid, labelid 
FROM tblprices p 
LEFT JOIN tblvariables v ON p.priceid = v.priceid 
ORDER BY productid, priceid 

यह मैं हर priceid और productid और किसी भी मिलान चर और लेबल आईडी मिल जाएगा। क्योंकि अब मैं जानता हूँ कि मैं priceid 2 के लिए एक रिकॉर्ड बनाने की आवश्यकता है कि

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) --- another price for product 

भी priceid 3 के लिए और variableids 10, 11, 12, और उसके बाद: यह, इस तरह जब मैं की तरह कुछ है के रूप में कुछ मामलों में अच्छा है उस उत्पाद के लिए।हालांकि, मैं भी है, और कोई चर के साथ उत्पादों, उत्पादों एक मूल्य और कई चर के साथ, और कई मूल्य वाले उत्पादों में कोई भी वेरिएबल के लिए इस डेटासेट से परिणाम प्राप्त उदाहरण के लिए:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) 
4  | 8   | (null)  | (null) --- 1 price no variables 
5  | 9   | 13   | 5  --- mult vars, 1 price 
5  | 9   | 14   | 5 
5  | 9   | 15   | 6 
5  | 9   | 16   | 6 
6  | 10  | (null)  | (null) --- mult price, no vars 
7  | 10  | (null)  | (null) 
8  | 10  | (null)  | (null) 

ऊपर डाटासेट ले रहा है, मैं चाहता हूँ इसलिए तरह मेरे tblpricesvariables तालिका में प्रविष्टियों जोड़ें:

 
variablepriceid | variableid | priceid | productid 
1    | 10   | 2  | 7 
2    | 11   | 2  | 7 
3    | 12   | 2  | 7 
4    | 10   | 3  | 7 
5    | 11   | 3  | 7 
6    | 12   | 3  | 7 
7    | 13   | 5  | 9 
8    | 14   | 5  | 9 
9    | 15   | 5  | 9 
10    | 16   | 5  | 9 

मैं इस प्रक्रिया को रिकॉर्ड के हजारों है, तो जाहिर है मैन्युअल रूप से यह कर जवाब नहीं है। क्या कोई मुझे कम से कम सही दिशा में इंगित कर सकता है, अगर इस तरह के ऑपरेशन को संभालने वाले स्पोक के साथ नहीं आ सकता है? मैं इस डेटा को बेहतर व्यवस्थित करने और/या संरचना के तरीके के बारे में किसी भी टिप्पणी का स्वागत करता हूं।

यह सब पढ़ने और मेरी मदद करने के लिए बहुत बहुत धन्यवाद।

उत्तर

2

कैसे के बारे में:

SELECT DISTINCT b.variableid, a.priceid, a.productid 
FROM tblprices AS a 
JOIN tblprices AS b ON a.productid = b.productid 
WHERE b.labelid IS NOT NULL 
ORDER BY priceid; 

+------------+---------+-----------+ 
| variableid | priceid | productid | 
+------------+---------+-----------+ 
|   10 |  2 |   7 | 
|   11 |  2 |   7 | 
|   12 |  2 |   7 | 
|   10 |  3 |   7 | 
|   11 |  3 |   7 | 
|   12 |  3 |   7 | 
|   13 |  5 |   9 | 
|   14 |  5 |   9 | 
|   15 |  5 |   9 | 
|   16 |  5 |   9 | 
+------------+---------+-----------+ 

tblvariables में डालने पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है;)

+0

पवित्र बकवास। यह वही है जो मुझे चाहिए (निश्चित रूप से कुछ मामूली जोड़ों के साथ)। वाह दोस्त वाह। – Jason

+0

आपका स्वागत है। अगली बार हालांकि कृपया डीन की सलाह का पालन करें और CREATE और INSERT कथन जोड़ें, अपनी डेटाबेस संरचना को पुन: उत्पन्न करने में इतना समय बचाता है। – chris

+0

आह, ठीक है, मैं देख रहा हूं कि आप क्या कह रहे हैं। मुझे माफ कर दो। मेरी प्रतीत होता है कि बड़ी समस्या (मेरे लिए) लेने और इसे बच्चे के खेल के रूप में दिखाने के लिए धन्यवाद। चीज़ – Jason

1

मुझे लगता है कि यह काम करना चाहिए:

चयन v.variableid, p.productid, p.priceid tblvariables वी, tblprices पी कहां में v.priceid (चयन s.priceid से tblprices रों कहां s.productid = p.productid);

अगली बार, क्या आप अपने सेटअप को दोहराने के लिए बनावट और कथन डालने में फेंक सकते हैं? धन्यवाद।

+0

हाँ, बनाता है और आवेषण वास्तव में कुछ समय के – chris

+0

बहुत बहुत धन्यवाद डीन बचाया होगा ... यह है एक उपयुक्त समाधान भी (सही डेटा प्राप्त करता है), लेकिन क्रिस को निष्पादित करने के लिए लगभग 7 एस लगते हैं और आपका लगभग 1-2 मिनट लगते हैं। सहायता के लिए धन्यवाद! – Jason

संबंधित मुद्दे