Pregunta

Tengo tres mesas:página, archivo adjunto, página adjunta

Tengo datos como este:

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

Me gustaría obtener el número de archivos adjuntos por página. también cuando ese número es 0.Lo he probado con:

select page.name, count(page-attachment.id) as attachmentsnumber 
from page 
    inner join page-attachment on page.id=page-id 
group by page.id

Obtengo este resultado:

NAME        ATTACHMENTSNUMBER
second page  2
third page   1

Me gustaría obtener este resultado:

NAME        ATTACHMENTSNUMBER
first page   0
second page  2
third page   1
fourth page  0

¿Cómo consigo la parte 0?

¿Fue útil?

Solución

Cambie su "unión interna" a una "unión externa izquierda", que significa "consígame todas las filas a la izquierda de la unión, incluso si no hay una fila coincidente a la derecha".

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

Otros consejos

Aquí hay otra solución que utiliza subconsultas.

SELECT
  p.name,
  (
    SELECT COUNT(*) FROM [page-attachment] pa
    WHERE pa.[PAGE-ID] = p.id
  ) as attachmentsnumber
FROM page p

Dependiendo de la base de datos, para mayor velocidad, puede usar el comando UNION.

El SQL es más largo, pero, dependiendo de la base de datos, acelera las cosas al separar "contar cosas que están allí" y "contar cosas que no están allí".

(
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)
)   

La base de datos para la que necesito esta solución tiene 20 páginas en más de un millón de archivos adjuntos.UNION lo hizo ejecutar en 13 segundos en lugar de tanto tiempo que me aburrí y probé de otra manera (en algún lugar más de 60 segundos antes de eliminar los métodos de subconsulta y unión externa).

Desea una combinación izquierda, en lugar de una combinación interna, ya que eso permite que los registros no existan.

La unión IZQUIERDA es tu amiga.Para obtener más información sobre los diferentes tipos de unión, consulte http://en.wikipedia.org/wiki/Join_(SQL)

Utilizar esta:

SELECT p.name,(
    SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top