मैं तीन टेबल है, कुछ की तरह: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
है - उन्हें सही तालिका का संदर्भ देने की आवश्यकता है! बाकी सभी एक ही रहते हैं, और बॉब की चाची!
आप मामले जो आप बता सकते हैं जो मूल्य अपने पहले प्रश्न में शामिल होने के लिए इस्तेमाल किया गया था का उपयोग कर अपने क्वेरी बना सकते हैं। –
अपने नमूना डेटा के लिए SQL Fiddle प्रदान करें, तो इसका उत्तर देना आसान होगा। –
याद रखें, अगर यह एक 'इनओडीबी' तालिका है, तो फ़ील्ड जो प्राथमिक कुंजी और विदेशी कुंजी हैं, तालिका स्कीमा में * पहले * परिभाषित की जानी चाहिए। –