عبارة SQL لتشمل الصفوف التي ليس لها نظائر في فرعي مترابط
سؤال
ولدي فرعي مترابط أدناه. كل معرف (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.