سؤال
لدي ثلاث جداول:الصفحة والتعلق صفحة المرفقات
لدي بيانات من هذا القبيل:
page
ID NAME
1 first page
2 second page
3 third page
4 fourth page
attachment
ID NAME
1 foo.word
2 test.xsl
3 mm.ppt
page-attachment
ID PAGE-ID ATTACHMENT-ID
1 2 1
2 2 2
3 3 3
أود الحصول على عدد المرفقات في الصفحة أيضا عندما يكون هذا العدد 0.لقد حاولت مع:
select page.name, count(page-attachment.id) as attachmentsnumber
from page
inner join page-attachment on page.id=page-id
group by page.id
أنا على الحصول على هذا الناتج:
NAME ATTACHMENTSNUMBER
second page 2
third page 1
أود الحصول على هذا الناتج:
NAME ATTACHMENTSNUMBER
first page 0
second page 2
third page 1
fourth page 0
كيف يمكنني الحصول على 0 ؟
المحلول
تغيير إعدادات "الداخلية الانضمام" إلى "صلة خارجية يسرى" ، التي تعني "أعطني جميع الصفوف على اليسار من الانضمام ، حتى لو لم يكن هناك مطابقة صف على اليمين."
select page.name, count(page-attachment.id) as attachmentsnumber
from page
left outer join page-attachment on page.id=page-id
group by page.name
نصائح أخرى
هنا حل آخر باستخدام الفرعية الاستعلام.
SELECT
p.name,
(
SELECT COUNT(*) FROM [page-attachment] pa
WHERE pa.[PAGE-ID] = p.id
) as attachmentsnumber
FROM page p
اعتمادا على قاعدة البيانات, سرعة, هل يمكن استخدام الاتحاد الأوامر.
SQL أطول ، ولكن اعتمادا على قاعدة البيانات ، سرعات الأمور إفصل "عد الأشياء التي هناك" و "عد الأشياء التي ليست هناك".
(
select page.name, count(page-attachment.id) as attachmentsnumber
from page
inner join page-attachment on page.id=page-id
group by page.id
)
UNION
(
select page.name, 0 as attachmentsnumber
from page
where page.id not in (
select page-id from page-attachment)
)
قاعدة البيانات اريد هذا الحل لمدة 20 صفحة في أكثر من مليون المرفقات.الاتحاد جعلت تشغيل في 13 ثانية بدلا من فترة طويلة شعرت بالملل و جربت طريقة أخرى (في مكان ما فوق 60 ثانية قبل أن أقتل الخارجي الانضمام و الاستعلام الفرعي طرق).
كنت ترغب في الانضمام إلى اليسار بدلا من صلة داخلية ، كما أن يسمح السجلات غير موجودة.
LEFT join هو صديقك.لمعرفة المزيد عن مختلف أنواع الصلة الرجوع إلى http://en.wikipedia.org/wiki/Join_(SQL)
استخدام هذا:
SELECT p.name,(
SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p