संबंधित मानों के साथ पंक्तियों को छोड़कर - mysql

मान लें कि मेरे पास एक तालिका है जो इस तरह दिखती है:

++++++++++++++++++++++++++++++++++++++++
url        | fieldname    | value
++++++++++++++++++++++++++++++++++++++++
a,b,c      | RATE         | 45
----------------------------------------
a,b,c      | PLAY         | 5
----------------------------------------
a,b,c      | DATE         | 2013-05-20
----------------------------------------
d,e,f      | PLAY         | 2
----------------------------------------
d,e,f      | DATE         | 2013-01-01
++++++++++++++++++++++++++++++++++++++++

मैं एक विशेष (अज्ञात!) मान के साथ सभी पंक्तियों को कैसे बाहर कर सकता हूं url स्तंभ, यदि समान पंक्तियों में से एक url मान में एक विशेष (ज्ञात!) मान होता है fieldname स्तंभ?

एक उदाहरण के रूप में, अगर मैं पंक्तियों को बाहर करना चाहता हूं तो मैं कैसे करूंगा RATE में fieldname, लेकिन यह भी "संबंधित" पंक्तियों (में एक ही मूल्य के साथ उन) url स्तंभ) - ताकि यह इस तरह से एक मेज लौटा दे ?:

++++++++++++++++++++++++++++++++++++++++
url        | fieldname    | value
++++++++++++++++++++++++++++++++++++++++
d,e,f      | PLAY         | 2
----------------------------------------
d,e,f      | DATE         | 2013-01-01
++++++++++++++++++++++++++++++++++++++++

फिर, ध्यान रखें कि द url मान क्वेरी में निर्दिष्ट नहीं होना चाहिए।

उत्तर:

उत्तर № 1 के लिए 1

यह "सेट-इन-सेट्स" क्वेरी का एक उदाहरण है। मुझे इसके साथ एकत्रीकरण का उपयोग करना पसंद है having खंड, क्योंकि यह सबसे सामान्य दृष्टिकोण है।

निम्नलिखित क्वेरी को आपके द्वारा रुचि रखने वाले URL मिलते हैं:

select url
from t
group by url
having sum(case when fieldname = "RATE" then 1 else 0 end) = 0;

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

select t.*
from t join
(select url
from t
group by url
having sum(case when fieldname = "RATE" then 1 else 0 end) = 0
) turl
on t.url = turl.url

संबंधित सवाल
सबसे लोकप्रिय