2012-03-13 17 views
7

मेरे पास दो टेबल हैं।mysql क्वेरी दो टेबल, यूनियन और जहां खंड

मैं इस तरह क्वेरी:

SELECT * FROM (
    Select requester_name,receiver_name from poem_authors_follow_requests as one 
UNION 
Select requester_name,receiver_name from poem_authors_friend_requests as two 
) as u 
where (LOWER(requester_name)=LOWER('user1') or LOWER(receiver_name)=LOWER('user1')) 

मैं यूनिअन उपयोग कर रहा हूँ क्योंकि मैं प्रत्येक उपयोगकर्ता के लिए अलग-अलग मान प्राप्त करना चाहते हैं एक उपयोगकर्ता पहले तालिका में और दूसरे में मौजूद रहने पर।

उदाहरण के लिए:

table1 

nameofuser 
peter 

table2 

nameofuser 
peter 

अगर पीटर या तो मेज पर है मैं क्योंकि यह दोनों टेबल पर मौजूद नाम एक बार मिलना चाहिए।

फिर भी मुझे पहली तालिका से एक पंक्ति और तालिका संख्या दो से एक पंक्ति मिलती है। गलत क्या है?

किसी भी मदद की सराहना की।

+0

एक ही समय के अपने टेबल के दोनों में स्तंभ हैं: where (LOWER(u.requester_name) = ...

इस उत्तर आप में देख सकते हैं करने के लिए simlar है? हो सकता है कि एक तालिका में कॉलम प्रकार 'char'and प्रकार के प्रकार में है' वर्चर 'मुझे कुछ जगहें मिल सकती हैं .... –

+0

nop वे दोनों एक ही प्रकार के फ़ील्ड हैं – stefanosn

+0

अपने कथन में, शायद आप चाहते हैं प्रत्येक फ़ील्ड से पहले "यू" को संदर्भित करने के लिए ... तो 'जहां (लोअर (u.requester_name) = ...' यह उस उत्तर के समान है जो आप देख सकते हैं: http://stackoverflow.com/questions/5452233/ जहां-स्टेटमेंट-ए-यूनियन-इन-एसक्यूएल –

उत्तर

11

आपके एसक्यूएल के साथ दो समस्याएं हैं:

  1. (इस नहीं सवाल है, लेकिन विचार किया जाना चाहिए) से अधिक का उपयोग करके WHERE टेबल के बजाय UNION, आप एक प्रदर्शन दुःस्वप्न बनाते हैं: MySQL UNION युक्त एक अस्थायी तालिका बनाएगा, फिर इसे WHERE पर क्वेरी करें। किसी क्षेत्र (LOWER(requester_name)) पर गणना का उपयोग करना इससे भी बदतर हो जाता है।

  2. कारण आप दो पंक्तियों पाने कि UNION DISTINCT केवल वास्तविक डुप्लिकेट को दबाने जाएगा, ताकि टपल (someuser,peter) और टपल (someotheruser, peter) दोहराव में परिणाम होगा, है।

संपादित

(someuser, peter) बनाने के (peter, someuser) का डुप्लिकेट आप इस्तेमाल कर सकते हैं:

SELECT 
    IF(requester_name='peter', receiver_name, requester_name) AS otheruser 
FROM 
    ... 
UNION 
SELECT 
    IF(requester_name='peter', receiver_name, requester_name) AS otheruser 
FROM 
    ... 

तो तुम केवल someuser जो आप पहले से जानते का चयन करें: peter

+0

मुझे यूजीन रिक कहने के लिए धन्यवाद, आप सही थे क्योंकि यह डुप्लिकेट पाता है आपने कहा ... क्या आप कृपया मुझे बता सकते हैं कि इसे हल करने का कोई तरीका है? (कुछ उपयोगकर्ता, पीटर) या (पीटर, कुछ उपयोगकर्ता) मेरे मामले में एक डुप्लिकेट होना चाहिए। – stefanosn

+0

मेरा जवाब संपादित किया गया! –

+0

धन्यवाद बहुत बहुत अच्छा दृष्टिकोण ! – stefanosn

-1

UNION पर नेस्टेड क्वेरी करने के बजाय आपको INTERSECT कीवर्ड का उपयोग करने में सक्षम होना चाहिए।

select requester_name, receiver_name 
from poem_authors_follow_requests 
where LOWER(requester_name) = LOWER('user1') or LOWER(receiver_name) = LOWER('user1') 
union 
select requester_name, receiver_name 
from poem_authors_friend_requests 
where LOWER(requester_name) = LOWER('user1') or LOWER(receiver_name) = LOWER('user1') 

दो प्रश्नों एक दूसरे से स्वतंत्र हैं:

SELECT member_id, name FROM a 
INTERSECT 
SELECT member_id, name FROM b 

बस

SELECT a.member_id, a.name 
FROM a INNER JOIN b 
USING (member_id, name) 

http://www.bitbybit.dk/carsten/blog/?p=71

+0

माईएसक्यूएल 'इंटरसेक्ट' कीवर्ड का समर्थन नहीं करता है! – onedaywhen

2

फिर से लिखा जा सकता है आप दोनों चयन पर जहां खंड की जरूरत है , तो आपको टी कनेक्ट करने की कोशिश नहीं करनी चाहिए union के अलावा हेम।

+0

मैंने इसे दो बार काम नहीं करने की कोशिश की !!! – stefanosn

0

आप पहले से ही संघ कर रहे हैं और कहां क्लॉज लागू कर रहे हैं। तो आपको "requester_name, receiver_name" का एक अनूठा संयोजन मिलेगा और फिर जहां क्लॉज लागू होगा। लागू करें जहां खंड प्रत्येक चयन में ...

Select requester_name,receiver_name from poem_authors_follow_requests 
where (LOWER(requester_name)=LOWER('user1') 
     or LOWER(receiver_name)=LOWER('user1')) 
UNION 
Select requester_name,receiver_name from poem_authors_friend_requests 
where (LOWER(requester_name)=LOWER('user1') 
     or LOWER(receiver_name)=LOWER('user1')) 
1

आप उपयोग कर सकते हैं यूनियन यदि आप अन्य एफ के बाद पंक्तियों का चयन करना चाहते हैं रोम एक टेबल से कई टेबल या पंक्तियों के कई सेट एक ही परिणाम सेट के रूप में सभी। यूनियन MySQL 4.0 के रूप में उपलब्ध है। यह खंड दिखाता है कि इसका उपयोग कैसे करें। मान लें कि आपके पास दो टेबल हैं जो संभावित और वास्तविक ग्राहकों को सूचीबद्ध करते हैं, एक तिहाई जो विक्रेताओं को सूचीबद्ध करता है जिनके द्वारा आप आपूर्ति खरीदते हैं, और आप सभी तीन तालिकाओं से नाम और पते विलय करके एक मेलिंग सूची बनाना चाहते हैं। यूनियन ऐसा करने का एक तरीका प्रदान करता है। ,

http://w3webtutorial.blogspot.com/2013/11/union-in-mysql.html

0

अपने जहां बयान में अपने बयान में जहां प्रत्येक क्षेत्र refence के लिए उर्फ ​​"यू" का संदर्भ: मान लीजिए तीन टेबल निम्नलिखित सामग्री है।

तो की शुरुआत अपने जहां बयान होगा जैसे: WHERE statement after a UNION in SQL?

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