سؤال

لديّ برنامج نصي يقوم بإنشاء استفسارات بالطريقة التالية (استنادًا إلى إدخال المستخدم):

SELECT * FROM articles 
 WHERE (articles.skeywords_auto ilike '%pm2%') 
  AND spubid IN (
   SELECT people.spubid FROM people 
   WHERE (people.slast ilike 'chow') 
   GROUP BY people.spubid) 
 LIMIT 1;

مجموعة البيانات الناتجة:

Array ( [0] => 
  Array ( 
          [spubid] => A00603 
          [bactive] => t 
          [bbatch_import] => t 
          [bincomplete] => t 
          [scitation_vis] => I,X 
          [dentered] => 2009-07-24 17:07:27.241975 
          [sentered_by] => pubs_batchadd.php 
          [drev] => 2009-07-24 17:07:27.241975 
          [srev_by] => pubs_batchadd.php 
          [bpeer_reviewed] => t 
          [sarticle] => Errata: PM2.5 and PM10 concentrations from the Qalabotjha low-smoke fuels macro-scale experiment in South Africa (vol 69, pg 1, 2001) 
          [spublication] => Environmental Monitoring and Assessment 
          [ipublisher] => 
          [svolume] => 71 
          [sissue] => 
          [spage_start] => 207 
          [spage_end] => 210 
          [bon_cover] => f 
          [scover_location] => 
          [scover_vis] => I,X 
          [sabstract] => 
          [sabstract_vis] => I,X 
          [sarticle_url] => 
          [sdoi] => 
          [sfile_location] => 
          [sfile_name] => 
          [sfile_vis] => I
          [sscience_codes] => 
          [skeywords_manual] => 
          [skeywords_auto] => 1,5,69,2001,africa,assessment,concentrations,environmental,errata,experiment,fuels,low-smoke,macro-scale,monitoring,pg,pm10,pm2,qalabotjha,south,vol 
          [saward_number] => 
          [snotes] => 

)

المشكلة هي أنني بحاجة أيضًا إلى جميع الأعمدة من جدول "الأشخاص" (كما هو مشار إليها في Sub Select) للعودة كجزء من مجموعة البيانات. لم أفعل (من الواضح) الكثير مع Sub Selects في الماضي ، لذا فإن هذا النهج جديد جدًا بالنسبة لي. كيف يمكنني سحب جميع الصفوف/الأعمدة المطابقة من جدول المقالات وكذلك الصفوف/العمود من جدول People؟

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

المحلول

هل أنت على دراية بالوصول؟ باستخدام بناء جملة ANSI:

SELECT DISTINCT *
  FROM ARTICLES t
  JOIN PEOPLE p ON p.spubid = t.spudid AND p.slast ILIKE 'chow'
 WHERE t.skeywords_auto ILIKE'%pm2%'
 LIMIT 1;

ينقذ المتميز من الاضطرار إلى تحديد مجموعة لكل عمود يتم إرجاعه من كلا الجدولين. قمت بتضمينه لأنك حصلت على المجموعة على انبعاثك الفرعي ؛ لا أعرف ما إذا كان ذلك ضروريًا بالفعل.

نصائح أخرى

ألا يمكنك استخدام انضمام بدلاً من الاختيار الفرعي في هذه الحالة؟

SELECT a.*, p.*
FROM articles as a
INNER JOIN people as p ON a.spubid = p.spubid
WHERE a.skeywords_auto ilike '%pm2%'
AND p.slast ilike 'chow'
LIMIT 1;

دعونا نبدأ من البداية

  • يجب ألا تحتاج إلى مجموعة. استخدم متميزًا بدلاً من ذلك (أنت لا تقوم بأي تجميع في الاستعلام الداخلي).
  • لرؤية محتويات الجدول الداخلي ، عليك بالفعل الانضمام إليه. لا يتم كشف المحتويات إلا إذا ظهرت في القسم من. يجب أن تكون هناك صلة خارجية من طاولة الأشخاص إلى طاولة المقالات معادلة للاستعلام في الاستعلام:

    SELECT *
    FROM people 
    LEFT OUTER JOIN articles ON articles.spubid = people.spubid 
    WHERE people.slast ilike 'chow' 
    AND articles.skeywords_auto ilike '%pm2%' 
    LIMIT 1
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top