عبارة SQL لتشمل الصفوف التي ليس لها نظائر في فرعي مترابط

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

  •  07-07-2019
  •  | 
  •  

سؤال

ولدي فرعي مترابط أدناه. كل معرف (147148149) في TABLE1 ديه العديد من السجلات في table2. معرف 148 ولكن لا يوجد لديه السجلات التي تطابق شرط الوقت في البيان. لذلك لا يتم تضمينه في الإخراج. أريد أن يتم تضمينها مع 0 للعمود العد. ما يحتاج إلى تغيير؟

SELECT b.fkid, COUNT(DISTINCT username)
FROM table2 AS b
WHERE
b.fkid IN ( 147,148,149 )
AND time > (SELECT SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) FROM table1 AS a WHERE a.id = b.fkid)
GROUP BY b.fkid

وترجع هذه العبارة:

b.fkid   COUNT(DISTINCT username)
147      41
149      26

وأريد أن العودة:

b.fkid   COUNT(DISTINCT username)
147      41
148       0
149      26

وحسنا حصلت على الحل. وهو نسخة معدلة من الإجابة rexem ل:

SELECT t.fkid,
   IFNULL(nu.num_users, 0)
FROM TABLE_2 t
LEFT JOIN (SELECT t.fkid,
                  COUNT(DISTINCT t.username) 'num_users'
           FROM TABLE_2 t
           JOIN TABLE_1 a ON a.id = t.fkid
                          AND SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) < t.time
           GROUP BY t.fkid) nu ON nu.fkid = t.fkid
WHERE t.fkid IN (147, 148, 149)
GROUP BY t.fkid, nu.num_users

Changes from rexem's answer:
"SEC_TO_TIME( 60*60 )) = t.time" to "SEC_TO_TIME( 60*60 )) < t.time"
Removed "t.time" in GROUP BY clause of subquery
هل كانت مفيدة؟

المحلول

وجرب:

   SELECT t.fkid,
          IFNULL(nu.num_users, 0)
     FROM TABLE_2 t
LEFT JOIN (SELECT t.fkid,
                  COUNT(DISTINCT t.username) 'num_users'
             FROM TABLE_2 t
             JOIN TABLE_1 a ON a.id = t.fkid
                           AND SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) = t.time
         GROUP BY t.fkid) nu ON nu.fkid = t.fkid
   WHERE t.fkid IN (147, 148, 149)
GROUP BY t.fkid, nu.num_users

نصائح أخرى

وحاول استخدام تلتحم للتعامل مع سيناريوهات حيث تتم مقارنة الوقت إلى مجموعة فارغة (على سبيل المثال، لأنه لا توجد مباريات بين table1 و table2):

SELECT b.fkid, COUNT(DISTINCT username)
FROM table2 AS b
WHEREb.fkid IN ( 147,148,149 )
AND time > COALESCE((SELECT SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) FROM table1 AS a WHERE a.id = b.fkid), 0)
GROUP BY b.fkid

وتلتحم يأخذ مجموعة غير محدودة من المعلمات، ومن هذه المجموعة، وسوف يعود أول معلمة غير فارغة.

SELECT a.ID, COUNT(DISTINCT username)
FROM table1 AS a LEFT JOIN table2 AS b
on a.ID = b.fkID
WHERE a.ID IN ( 147,148,149 )
AND b.time > SUBTIME(a.endTime, SEC_TO_TIME( 60*60 )) 
GROUP BY a.ID

هل هذه المساعدة في أي حال؟

وتحرير: لست متأكدا إذا كان هذا يمكن أن تعمل في الخلية. ولكن، وآمل أن الحصول على هذه الفكرة لبناء الاستعلام باستخدام هذا.

وأعتقد أن أفضل فرصتك في الحصول على صفر في نتيجة يستخدم (منفصلتين) UNION. إن الجزء الأول يكون الاستعلام الحالي الخاص بك؛ ان الشرط الثاني العثور على القيم حيث لا توجد مقالات ذات الصلة، واختيار ثابت 0 للعمود العد.

وفي كثير من الأحيان، وهو صلة خارجية سوف تفعل خدعة. وتكمن الصعوبة هنا هي أن انضمام الخارجي شأنه أن يؤدي إلى صف من البيانات لID = 148، وبالتالي COUNT من شأنه أن يعطي جوابا من 1، ليست 0.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top