سؤال

لدي ثلاث جداول:الصفحة والتعلق صفحة المرفقات

لدي بيانات من هذا القبيل:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top