2016-05-03 9 views
7

मैं तीन टेबल है, कुछ की तरह:PHP, MySQL - एकाधिक, पहचान योग्य, पंक्तियां एक एकल जॉइन से लौट आईं?

*table1* 

id | val1 | val2 | val3 | val4 | val5 
1 | ... | ... | ... | ... | ... 
2 | ... | ... | ... | ... | ... 
3 | ... | ... | ... | ... | ... 
... etc 

और

*table2* 

id | som1 | som2 
1 | ... | ... 
2 | ... | ... 
3 | ... | ... 
... etc 

और

*table3* 

id | col1 | col2 
1 | ... | ... 
2 | ... | ... 
3 | ... | ... 
... etc 

जहां तीसरे तालिका में col2 होगा हमेशा एकल मान val3 से, शामिल val4 या val5 से पहली टेबल दूसरी तालिका केवल पूर्णता के लिए प्रश्न में शामिल है, और यह मुद्दा नहीं है।

क्वेरी मैं निम्नलिखित है:

$db = new PDO(...); 
$stmt = $db->prepare("SELECT t2.som1 AS t2som1, 
          t1.val1 AS t1v1, 
          t1.val2 AS t1v2, 
          t1.val3 AS t1v3, 
          t1.val4 AS t1v4, 
          t1.val5 AS t1v5, 
          t3.col1 AS t3col1 
         FROM table1 t1 
          JOIN table2 t2 ON t1.val2 = t2.som2 
          JOIN table3 t3 ON t1.val3 = t3.col2 
         WHERE (t1.val4=:input OR t1.val5=:input) 
         AND (t1.val1=1 OR t1.val1=2)"); 

$stmt->execute(array('input'=>$inputVal)); 
$result = $stmt->fetchAll(); 

और उम्मीद के रूप में इस इलाज काम करता है, वास्तव में।

लेकिन!

मैं t1.val3 = t3.col2 के लिए t3col1 की आवश्यकता नहीं है। मैं भी t1.val4 = t3.col2 और t1.val5 = t3.col2

के लिए इसकी आवश्यकता मैं लाइन का निर्माण कर सकते हैं:

JOIN table3 t3 ON (t1.val3 = t3.col2 OR t1.val4 = t3.col2 OR t1.val5 = t3.col2) 

लेकिन तब मैं जो मूल्यt3col1 प्राप्त करने के लिए इस्तेमाल किया गया था पता नहीं है। और यह केवल तीनों की बजाय एक एकल मूल्य देता है।

मेरी समस्या देखें !?

मैं

SELECT t2.som1 AS t2som1, 
     ... 
     t3.col1 AS t3col1, // for condition t1.val3 = t3.col2 
     t3.col1 AS t3col2, // for condition t1.val4 = t3.col2 
     t3.col1 AS t3col3 // for condition t1.val5 = t3.col2 

इस किया जा सकता है करना चाहते हैं?

स्पष्टीकरण

यदि val1, val2 और val3 सभी मान हैं, मैं एक एकल पंक्ति चाहते हैं table3 से सभी तीन मैचों के साथ वापस लौट आया। तीन अलग-अलग पंक्तियां नहीं हैं, जो मेल कॉलम को छोड़कर सभी समान हैं।

This SQLFiddle मैं क्या उदाहरण चाहता हूं इसका एक उदाहरण है। ध्यान दें कि t3col1 कॉलम को छोड़कर सबकुछ समान है। यह सभी t3col1 मानों के साथ एक पंक्ति होनी चाहिए।

/स्पष्टीकरण

मुझे लगता है मैं मेज तीन अलग-अलग बार शामिल हों सकते हैं: करने के लिए मैं कैसे कर रहा हूँ

SELECT t2.som1 AS t2som1, 
     ... 
     t3.col1 AS t3col1 
     t4.col1 AS t3col2 
     t5.col1 AS t3col3 
FROM table1 t1 
    JOIN table2 t2 ON t1.val2 = t2.som2 
    JOIN table3 t3 ON t1.val3 = t3.col2 // for condition t1.val3 = t3.col2 
    JOIN table3 t4 ON t1.val4 = t3.col2 // for condition t1.val4 = t3.col2 
    JOIN table3 t5 ON t1.val5 = t3.col2 // for condition t1.val5 = t3.col2 
WHERE (...) 
AND (...) 

लेकिन मैं इसे इस तरह से कर रही है प्रदर्शन खो देते हैं (यानी 4 कार्यभार संभाला), का विरोध किया इसे करने की कोशिश कर रहा है, केवल 2 के साथ?

बोनस!

कभी कभीval3, val4 और/या val5 खाली हो जाएगा (लेकिन col2कभी नहीं खाली है)। सभी टेबल 3 जॉइन को LEFT JOIN एस होना चाहिए, उन मामलों के लिए खाली मूल्यों के साथ?

संपादित करें 1

आपके अनुरोध के अनुसार, मैं यह SQLFiddle में सेट अप है, लेकिन सेवा मारा और याद आती है है।

आप इसे here

संपादित 2

मैं table3 कई बार में शामिल होने की कोशिश की पा सकते हैं:

SELECT t2.som1 AS t2som1, 
     ... 
     t3.col1 AS t3col1 
     t4.col1 AS t3col2 
     t5.col1 AS t3col3 
FROM table1 t1 
    JOIN table2 t2 ON t1.val2 = t2.som2 
    JOIN table3 t3 ON t1.val3 = t3.col2 // for condition t1.val3 = t3.col2 
    JOIN table3 t4 ON t1.val4 = t3.col2 // for condition t1.val4 = t3.col2 
    JOIN table3 t5 ON t1.val5 = t3.col2 // for condition t1.val5 = t3.col2 
WHERE (...) 
AND (...) 

और प्रत्येक मैच के लिए एक पंक्ति हो रही समाप्त हो गया। मैं 7 परिणाम नहीं निकला जाना चाहिए था, और अधिक से अधिक 90

val1 हो रही हमेशा एक मूल्य होगा समाप्त हो गया है, और चाहे val2 और val3 भर जाती है हर बार अलग है। लेकिन जब सभी तीनों के पास मूल्य होते हैं, तो मैं इसके लिए तीन अलग-अलग रिटर्न नहीं चाहता हूं। इसके बजाए, मैं बस चाहता हूं कि इसमें सभी तीन मैचों के साथ वापसी हो।

संपादित 4 (स्पष्टीकरण 3 था ...)

कई मिलती संपादित 2 से क्या काम कर रहा समाप्त हो गया था, सिराज के जवाब के लिए धन्यवाद।

JOIN table3 t3 ON t1.val3 = t3.col2 
JOIN table3 t4 ON t1.val4 = t3.col2 
JOIN table3 t5 ON t1.val5 = t3.col2 

जब मैं का इस्तेमाल किया है चाहिए::

JOIN table3 t3 ON t1.val3 = t3.col2 
JOIN table3 t4 ON t1.val4 = t4.col2 
JOIN table3 t5 ON t1.val5 = t5.col2 

सूचना अंतर समस्या यह है कि मैं का इस्तेमाल किया था? प्रत्येक बराबर चिह्न के बाद यह केवल t3.col2 है - उन्हें सही तालिका का संदर्भ देने की आवश्यकता है! बाकी सभी एक ही रहते हैं, और बॉब की चाची!

+0

आप मामले जो आप बता सकते हैं जो मूल्य अपने पहले प्रश्न में शामिल होने के लिए इस्तेमाल किया गया था का उपयोग कर अपने क्वेरी बना सकते हैं। –

+1

अपने नमूना डेटा के लिए SQL Fiddle प्रदान करें, तो इसका उत्तर देना आसान होगा। –

+0

याद रखें, अगर यह एक 'इनओडीबी' तालिका है, तो फ़ील्ड जो प्राथमिक कुंजी और विदेशी कुंजी हैं, तालिका स्कीमा में * पहले * परिभाषित की जानी चाहिए। –

उत्तर

3

क्वेरी नीचे आप डेटा दे देंगे के रूप में आप चाहते थे:

SELECT t2.som1 AS t2som1, 
t1.val1 AS t1v1, 
t1.val2 AS t1v2, 
t1.val3 AS t1v3, 
t1.val4 AS t1v4, 
t1.val5 AS t1v5, 
t3.col1 AS t3col1, 
t3.col2 AS t3col2, 
CASE WHEN t1.val3 = t3.col2 THEN t3.col1 ELSE '' END AS 't3col11', 
CASE WHEN t1.val4 = t3.col2 THEN t3.col1 ELSE '' END AS 't3col21', 
CASE WHEN t1.val5 = t3.col2 THEN t3.col1 ELSE '' END AS 't3col31', 
CASE WHEN t1.val3 = t3.col2 THEN 't1col3' 
ELSE CASE WHEN t1.val4 = t3.col2 THEN 't1col4' ELSE 't1col5' 
END END AS ColumnName 
FROM table1 t1 
    JOIN table2 t2 ON t1.val2 = t2.som2 
    JOIN table3 t3 ON (t1.val3 = t3.col2 OR t1.val4 = t3.col2 OR t1.val5 = t3.col2) 
GROUP BY t2som1,t1v1, t1v2, t1v3, t1v4, t1v5 

अंतिम स्तंभ वह यह है कि 'columnName' आपको यह बताती है t1 स्तंभ एक है कि मान से मेल खाता था।

संपादित करें - का उपयोग करते हुए बाएं में शामिल होने

SELECT t2.som1 AS t2som1, 
t1.val1 AS t1v1, 
t1.val2 AS t1v2, 
t1.val3 AS t1v3, 
t1.val4 AS t1v4, 
t1.val5 AS t1v5, 
t3.col1 AS t3col1, 
    t3.col1 AS t3col1, 
    t4.col1 AS t3col2, 
    t5.col1 AS t3col3 
FROM table1 AS t1 
LEFT JOIN table2 t2 ON t1.val2 = t2.som2 
LEFT JOIN table3 t3 ON t1.val3 = t3.col2 
LEFT JOIN table3 t4 ON t1.val4 = t4.col2 
LEFT JOIN table3 t5 ON t1.val5 = t5.col2 
+0

यह मुझे संभावित रूप से तीन बार जितना चाहें उतना परिणाम देता है। मैं इसे [यहां] चला रहा हूं (http://sqlfiddle.com/#!9/72835/11) जो आपने दिया है, और आप देखेंगे कि पहला (पहला), सातवां (7 वां) और बारहवां (12 वीं) पंक्तियां वापस समान हैं, 't3col1' मानों के लिए सहेजें। मुझे इन तीनों t'col1' कॉलम भरने के साथ, एक पंक्ति में घनत्व की आवश्यकता है। – Birrel

+0

मैंने मूल पोस्ट में "स्पष्टीकरण" अनुभाग जोड़ा है, जो वर्णन करता है कि मैं क्या लौटाऊंगा। – Birrel

+0

तो आप या तो अलग या समूह का उपयोग कर सकते हैं? –

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