MySQL: بيان انضمام معقد يتضمن جدولين وجدول ارتباط ثالث

StackOverflow https://stackoverflow.com/questions/2814712

سؤال

لدي جدولين تم بناؤهما لنظامين متباينان. لدي سجلات في جدول واحد (يسمى "Leads") تمثل العملاء ، والسجلات في جدول آخر (يسمى "Manager") الذين هم نفس العملاء ولكن "Manager" يستخدم مجالات مختلفة

(على سبيل المثال ، يحتوي "Leads" على عنوان بريد إلكتروني ، ويحتوي "المدير" على حقلين لبعثتين مختلفتين-قد يكون أي منهما البريد الإلكتروني من "Leads").

لذلك ، قمت بإنشاء جدول ارتباط يحتوي على Lead_id و Manager_id. حاليا جدول الارتباط هذا فارغ.

أحاول الاستعلام عن جدول "Leads" لإعطائي السجلات التي تتطابق مع حقل البريد الإلكتروني "مدير" مع حقل البريد الإلكتروني "Leads" ، وفي الوقت نفسه تجاهل الحقول التي تمت إضافتها بالفعل إلى جدول "Conslated" . (بهذه الطريقة أستطيع أن أرى عدد العملاء المتوقعين الذين لم يتم ربطها بعد.) ها هي محاولة SQL الحالية غير الصالحة:

SELECT leads.id, manager.id
  FROM leads, manager
  LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
  WHERE correlation.id IS NULL
  AND leads.project != "someproject"
  AND (manager.orig_email = leads.email OR manager.dest_email = leads.email)
  AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
  ORDER BY leads.created ASC;

أحصل على الخطأ: عمود غير معروف 'leads.id' في 'On end'

قبل أن تتساءل: هناك سجلات في جدول "Leads" حيث leads.project! = "SomeProject" و Leads.created يقع بين تلك التواريخ. لقد قمت بتضمين تلك المعلمات الإضافية للاكتمال.

هل كانت مفيدة؟

المحلول

لديك الجداول المدرجة في الجولة الخاطئة ، لذا فإن الانضمام الخارجي الأيسر هو الانضمام manager ل correlation بدلاً من leads ل correlation كما تنوي. حاول تبديلها حولها:

SELECT leads.id, manager.id
  FROM manager, leads
  LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
  WHERE correlation.id IS NULL
  AND leads.project != "someproject"
  AND (manager.orig_email = leads.email OR manager.dest_email = leads.email)
  AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
  ORDER BY leads.created ASC;

بشكل عام ، أوصي بعدم خلط النمط القديم والجديد لتجنب هذا النوع من الخطأ بالضبط. أفضل رؤية شيء مثل هذا:

SELECT leads.id, manager.id
  FROM leads
  LEFT OUTER JOIN correlation ON correlation.lead_id = leads.id
  JOIN manager ON manager.orig_email = leads.email OR manager.dest_email = leads.email
  WHERE correlation.id IS NULL
  AND leads.project != "someproject"
  AND leads.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-10 23:59:59'
  ORDER BY leads.created ASC;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top