2012-09-21 12 views
7

में दाएं जुड़ने जैसे बाएं जुड़ने का उपयोग कैसे करें, इसलिए मैं थोड़ी देर के लिए अपने दिमाग को रैक कर रहा हूं। सिद्धांत में सही शामिल होने की कोई अवधारणा नहीं है। मुझे पता है कि आप बाएं शामिल होने जैसे बाएं शामिल होने का उपयोग कर सकते हैं लेकिन मैं इसे अपने उदाहरण के लिए नहीं समझ सकता, इसलिए मैं यहां हूं।डॉक्टरेट

मेरा उदाहरण: मेरे पास सिद्धांत में एक इकाई है जिसका एक-से-एक संबंध है जिसे "पैरेंट" कहा जाता है। मैं सभी संस्थाओं और उनके बच्चों को प्राप्त करने की कोशिश कर रहा हूं (यदि वे मौजूद हैं) बिना डुप्लिकेट के।

एक सही साथ

में शामिल होने के लिए इस कारण मैं कह सकता हूँ सरल है:

SELECT parent.*, child.* 
    FROM table child 
    RIGHT JOIN table parent ON parent.id = child.parent_id 
    WHERE parent.parent_id is null; 

लेकिन एक छोड़ दिया उपयोग करके शामिल मैं लौट आए परिणाम है कि मैं समझ नहीं क्या जहां खंड होना चाहिए उन्हें बाहर फिल्टर करने के लिए कर रहा हूँ।

तो मेरा सवाल यह है कि "क्या सिद्धांत में सही शामिल होने का कोई तरीका है" या "मैं बाएं जॉइन ऑपरेशन का उपयोग कैसे कर सकता हूं जैसे सही जुड़ाव"?

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

तुम लोग आप टेबल मैं से चयन के आदेश को बदलने के बारे में क्या कह रहे हैं सही कर रहे हैं, लेकिन मैं सिद्धांत का उपयोग कर रहा है ताकि संबंध बच्चे के> माता पिता है।

मेरे निकाय::

/** 
* @Entity 
* @Table(name="entity") 
*/ 
class Entity 
{ 
... 
/** 
* @OneToOne(
*  targetEntity="Entity", 
*  fetch="EAGER" 
*) 
* @JoinColumn(name="parent_id", referencedColumnName="id") 
*/ 
private $parent; 
... 
} 

मेरे सिद्धांत का चयन बयान:

$em->createQueryBuilder() 
->select(array('child', 'parent')) 
->from('Entity', 'child') 
->leftjoin('child.parent', 'parent') 
->orderBy('parent.id','asc') 
->getQuery() 
->execute(); 

मुझे यकीन है कि कैसे और अगर मैं तालिकाओं के आदेश स्विच कर सकते हैं नहीं कर रहा हूँ यहाँ मेरी सिद्धांत क्वेरी है। मैंने इकाई से खुद से एक और रिश्ते बनाने की कोशिश की (जैसे मैंने माता-पिता किया) लेकिन इसे बच्चा कहा जाता है। लेकिन जब मैंने नए स्कीमा सिद्धांत के साथ डीबी को अद्यतन किया तो त्रुटियों को फेंक दिया।

कोई विचार? और त्वरित प्रतिक्रियाओं के लिए धन्यवाद!

--- संपादित 2 ---

वाम में शामिल होने एसक्यूएल और परिणाम:

SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id, 
    parent.changed_timestamp, parent.parent_entity_id 
FROM content child 
LEFT JOIN content parent ON child.parent_entity_id = parent.id 
ORDER BY parent.id ASC 

child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id 
1   8/16/12 20:29 NULL    NULL  NULL    NULL 
7   9/20/12 16:07 NULL    NULL  NULL    NULL 
8   8/17/12 16:08 NULL    NULL  NULL    NULL 
9   8/17/12 20:44 NULL    NULL  NULL    NULL 
10   8/17/12 21:03 NULL    NULL  NULL    NULL 
11   8/17/12 21:17 NULL    NULL  NULL    NULL 
194   9/19/12 9:58 NULL    NULL  NULL    NULL 
195   9/20/12 10:38 NULL    NULL  NULL    NULL 
196   9/19/12 11:58 NULL    NULL  NULL    NULL 
197   NULL   196     196   9/19/12 11:58  NULL 
200   9/20/12 16:02 1     1   8/16/12 20:29  NULL 
202   9/20/12 16:35 NULL    NULL  NULL    NULL 
204   9/21/12 8:41 NULL    NULL  NULL    NULL 
206   NULL   204     204   9/21/12 8:41  NULL 

परिणाम सही में शामिल होने:

SELECT child.id, child.changed_timestamp, child.parent_entity_id, parent.id, 
parent.changed_timestamp, parent.parent_entity_id 
FROM content child 
RIGHT JOIN content parent ON child.parent_entity_id = parent.id 
WHERE parent.parent_entity_id is null 
ORDER BY parent.id ASC 

child_id child_timestamp parent_entity_id parent_id parent_timestamp parent_entity_id 
200   9/20/12 16:02 1     1   8/16/12 20:29  NULL 
NULL  NULL   NULL    7   9/20/12 16:07  NULL 
NULL  NULL   NULL    8   8/17/12 16:08  NULL 
NULL  NULL   NULL    9   8/17/12 20:44  NULL 
NULL  NULL   NULL    10   8/17/12 21:03  NULL 
NULL  NULL   NULL    11   8/17/12 21:17  NULL 
NULL  NULL   NULL    194   9/19/12 9:58  NULL 
NULL  NULL   NULL    195   9/20/12 10:38  NULL 
197   NULL   196     196   9/19/12 11:58  NULL 
NULL  NULL   NULL    202   9/20/12 16:35  NULL 
206   NULL   204     204   9/21/12 8:41  NULL 

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

+4

'बच्चे का अधिकार तालिका अभिभावक पर parent.id = child.parent_id'' tableparent LEFT जॉइन बच्चे के समान है parent.id = child.parent_id' –

+0

कृपया नमूना डेटा और वांछित आउटपुट प्रदान करें। – RedFilter

+0

जोड़ा गया :) धन्यवाद! –

उत्तर

0

@ 491243 की टिप्पणी सही है: यदि आप एसक्यूएल का उपयोग कर रहे थे तो यह एक छोटी सी समस्या होगी क्योंकि बाएं और दाएं जुड़ने आसानी से परिवर्तनीय और रिलेशनल भविष्यवाणियों को किसी भी क्रम में व्यक्त किया जा सकता है।

असली समस्या यह नहीं है कि बाएं एक के रूप में सही तरीके से जुड़ने के तरीके को कैसे लिखना है, लेकिन दूसरी दिशा में अपने रिश्ते को कैसे पार करना है। मुमकिन है कि आप सिर्फ इस ?: तरह

$em->createQueryBuilder() 
->select(array('child', 'parent')) 
->from('Entity', 'parent') 
->leftjoin('parent.child', 'child') 
->orderBy('parent.id','asc') 
->getQuery() 
->execute(); 
0

इस एक कोशिश कुछ नहीं कर सकते:

SELECT 
    parenttable.*, childtable.* 
FROM childtable 
RIGHT JOIN parenttable ON parenttable.id = childtable.parent_id 
WHERE 
    parenttable.parent_id IS NULL 
    AND 
    childtable.childid IS NOT NULL; 
0

बाईं में शामिल होने आप तैनात नहीं था: जहां माता-पिता।parent_entity_id शून्य

मुझे लगता है कि आपके डेटा के भीतर, इसका मतलब है कि रिकॉर्ड स्वयं ही एक बच्चा नहीं है।

इसलिए यदि आप सिर्फ सही जरूरत एसक्यूएल आप में शामिल होने के एक छोड़ दिया के रूप में प्रदान में शामिल होने, ये रहा:

चयन child.id, child.changed_timestamp, child.parent_entity_id, parent.id, parent.changed_timestamp, अपने डेटा को कई पीढ़ियों के लिए अनुमति देता है, उदाहरण के लिए: parent.parent_entity_id से सामग्री माता पिता बाईं तरफ child.parent_entity_id = parent.id
कहां parent.parent_entity_id द्वारा आदेश parent.id एएससी

नोट रिक्त है सामग्री बच्चे शामिल हों भव्य बच्चों आदि, जहां उपरोक्त खंड न केवल बच्चों को, बल्कि भव्य बच्चों को फ़िल्टर कर रहा है। इसके बदले बच्चे के डेटा पर असर पड़ता है: अगर वे बड़े बच्चे हैं तो बच्चे वापस नहीं लौटाए जाएंगे।

0

वास्तव में सिद्धांत स्क्रिप्ट से परिचित नहीं है, लेकिन ... यह पुरानी शैली JOIN एक RIGHT JOIN सबसे SQL स्क्रिप्ट में के रूप में ही परिणाम प्राप्त करना चाहिए:

SELECT parent.*, child.* 
    FROM table child, table parent 
    WHERE parent.id = child.parent_id 
    OR child.parent_id IS NULL; 
0

इन दो बयानों के बराबर हैं:

SELECT parent.*, child.* 
FROM table child 
RIGHT JOIN table parent ON parent.id = child.parent_id 
WHERE parent.parent_id is null; 

SELECT parent.*, child.* 
FROM table parent 
LEFT JOIN table child ON child.parent_id = parent.id 
WHERE parent.parent_id is null; 

मैं कभी भी सही जॉइन का उपयोग नहीं करता हूं। मुझे लगता है कि यह केवल पूर्णता के लिए एसक्यूएल में शामिल है।

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