Consulta COUNT y SELECT de dos tablas

Tengo estas dos tablas:

1. users
   -id
   -name
   -email
   -rank

2. pages
   -user
   -id

Necesito seleccionar todos los datos de los usuarios y contar cuántas páginas escribió (de las páginas, el usuario es la identificación del usuario de la tabla de usuarios).

¿Puedes convertirlo en una consulta compleja?

preguntado el 12 de junio de 12 a las 12:06

Todas las respuestas a continuación usan uniones internas, pero sugiero un LEFT JOIN por lo que obtiene 0 para usuarios sin páginas en lugar de sin registro. -

Demasiadas buenas respuestas :D -

8 Respuestas

select u.*,count(p.*) from users u left join pages p on u.id=p.user group by u.id;

Respondido el 12 de junio de 12 a las 12:06

@DanBarzilay Por favor reconsidere estudiar SQL correctamente, u y p son nombres de alias para la tabla. - Vishwanath Dalvi

Entonces, ¿por qué también hay users y u aquí: from users u left - Dan Barzilay

son alias para tablas users y pages. ...from users u crea un alias u para su users mesa. Lo mismo para las páginas - Oerd

@Dan, Viswanathan es muy cierto... Please reconsider studying SQL properly - manurajhada

No puedo convertirlo en una consulta compleja, pero aquí hay una simple:

SELECT u.name, u.email, u.rank, u.id, count(p.id) as 'PageCount'
FROM Users u
JOIN Pages p ON
    p.id = u.id
GROUP BY u.name, u.email, u.rank, u.id

Respondido el 12 de junio de 12 a las 12:06

Oye, gracias por tu respuesta, ahora agregué otra tabla para comentarios, ¿cómo puedo mejorar tu consulta para mostrar también la cantidad de comentarios del usuario? (la tabla de comentarios es exactamente como las páginas). - Dan Barzilay

Para hacerlo en la misma consulta, simplemente agregaría otro JOIN a la tabla de comentarios: JOIN Comment c ON c.id = u.id - pero como dice @Michael en su comentario a su pregunta, ahora usaría un LEFT OUTER JOIN para recuperar los registros de todos los usuarios; si no, solo verá los que han escrito una página. y un comentario. - Widor

@Widor, amablemente, permítanme aclararme, es decir, ¿producirá la consulta el resultado correcto (lógicamente) si dos usuarios tienen el mismo nombre? - manurajhada

@manurajhada Mientras tengan una diferente id entonces esta consulta producirá una fila por usuario (incluso si el name los campos son idénticos). - Widor

Sí, hazlo así:

select u.id, u.name, u.email, u.rank, count(p.id) as 'counter' from users u
inner join pages p on p.user = u.id
group by u.id, u.name, u.email, u.rank

Agrupa por la información de los usuarios y calcula (cuenta) el número de páginas para cada usuario.

Respondido el 12 de junio de 12 a las 12:06

Qué tal esto.

select   u.id, count(p.id) as 'number_of_pages_wrote'
from     users u inner join pages p
on       u.id = p.id
group by u.id;

Respondido el 12 de junio de 12 a las 12:06

Puedes hacerlo así:

SELECT u.*, p.count
FROM users u,
     (SELECT pa.id, count(1) FROM pages pa WHERE pa.id = u.id) p
WHERE u.id = p.id 

Respondido el 12 de junio de 12 a las 12:06

¿Qué pasa con esta simple consulta?

SELECT user, COUNT(*) AS pages FROM page GROUP BY user

Respondido el 12 de junio de 12 a las 12:06

select   users.id, users.name,users.email,users.rank, count(pages.id) 
from     users,pages 
where    users.id = pages.user 
group by users.id

Respondido el 12 de junio de 12 a las 13:06

Esto puede lograrse mediante un JOIN.

Por ejemplo,

SELECT * FROM pages 
INNER JOIN users ON (users.id=pages.user) 
WHERE users.id=5

seleccionará todas las páginas del ID de usuario 5. Te dejaré hacer el resto para incluir la función agregada;)

Respondido el 12 de junio de 12 a las 12:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.