سؤال
لدي العديد من العديد من الجدول الرقم القياسي, و أنا أريد أن تشمل/استبعاد نوع الاستعلام على ذلك.
fid هو حقا صحيح مؤشر, ولكن هنا الحروف لتسهيل الفهم.هنا عينة الجدول :
الجدول t
eid | fid
----+----
1 | A
1 | B
1 | C
2 | B
2 | C
3 | A
3 | C
4 | A
4 | B
5 | B
وإليك بعض نماذج الاستفسارات أريد.
- ماذا الأعياد قد fid B وليس A ؟ (الجواب العيد 2 و 5)
- ماذا الأعياد قد fid ج لا ؟ (الجواب العيد 2)
أنا لا يمكن أن يبدو لمعرفة استعلام من شأنها أن تفعل هذا.
لقد حاولت النفس الانضمام إلى مثل هذه:
select *
from t as t1
join t as t2
where t1.eid=t2.eid
and t1.fid!=t2.fid
and t1.fid=B and t2.fid!=A
هذا لن يعمل لأنه لا يزال يعود الصفوف حيث العيد=1 و fid=C.
هل أنا واضح على ما أريد ؟
المحلول
هنا مثال استعلام 1 (2 يعمل قدر نفسه)
select t1.eid
from t t1
where t1.fid = 'B'
and not exists
(select 1
from t t2
where t2.eid = t1.eid
and t2.fid = 'A')
نصائح أخرى
استخدام مجموعة الطرح
Select eid from t where fid = 'B' EXCEPT select eid from t where fid = 'A'
يمكنك استخدام حدد الفرعية
حدد العيد من t حيث fid = 'ج' و العيد ليس في (حدد العيد من t حيث fid = 'A')
MySQL 5.0 يدعم حيث يوجد/حيث لم يكن موجودا ، كما هو موضح من قبل نايجل و مايك.
نسخة مع مستقيم ينضم التي قد تكون أسرع من استخدام موجود:
Select t1.eid From #test t1 left join ( Select eid From #test t2 Where fid = 'A' Group by eid ) t2 on t2.eid = t1.eid Where t1.fid = 'B' and t2.eid is null
وينبغي أن يكون من الممكن القيام بذلك دون استخدام الاستعلام الفرعي:
SELECT DISTINCT t1.eid
FROM table1 AS t1
LEFT JOIN table1 AS t2 ON (t1.eid = t2.eid AND t2.fid = 'A')
WHERE t2.eid IS NULL
AND t1.fid = 'B';
إلى المثال الثاني البحث فقط تغيير قيمة " ب " إلى "C".
ننظر إلى ناقص المشغل.وهي تعمل مثل الاتحاد, إلا أنه يطرح فيها الاتحاد يضيف.الإجابة السابقة مع كلمة "إلا" قد تكون كلمه مختلفة لنفس الشيء.
وهنا تختبر الجواب:
select eid
from t
where fid = 'A'
minus
select eid
from t
where fid = 'B'