سؤال

لدي العديد من العديد من الجدول الرقم القياسي, و أنا أريد أن تشمل/استبعاد نوع الاستعلام على ذلك.

fid هو حقا صحيح مؤشر, ولكن هنا الحروف لتسهيل الفهم.هنا عينة الجدول :

الجدول t

eid | fid
----+----
1   | A
1   | B
1   | C
2   | B
2   | C
3   | A
3   | C
4   | A
4   | B
5   | B

وإليك بعض نماذج الاستفسارات أريد.

  1. ماذا الأعياد قد fid B وليس A ؟ (الجواب العيد 2 و 5)
  2. ماذا الأعياد قد 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'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top