2011-12-07 27 views
9

así que tengo una consulta mysql que consulta una tabla "contactos" cada contacto luego tiene compras. Las compras están en una tabla relacionada. Quiero mostrar cada nombre de los contactos con el número de compras que han hecho a la derecha de esta manera:recuento MYSQL registros relacionados con una consulta

Adam(1) 
Mike(8) 
Steve(3) 

Mi SQL actual es el siguiente:

SELECT * FROM contacts ORDER BY contacts.name ASC" 

y mi tabla actual es el siguiente:

Adam 
Mike 
Steve 

el fin de sacar el recuento de los relacionados (compras) de tabla en la tabla actual sé que tengo para unirse a la mesa de "compras" de alguna forma y luego usar el GROUP BY y count() diversión ction, pero no estoy seguro de cómo construir esta declaración sql. Alguien me puede ayudar.

Una vez más todo lo que estoy tratando de hacer es enumerar una mesa (contactos) y el recuento de registros se relaciona (compras) y tienen que parezca esto:

Adam(1) 
Mike(8) 
Steve(3) 

muchas gracias por cualquier ayuda.

Respuesta

21

Asumiendo la tabla purchases tiene una clave externa a la tabla contacts llama contact_id, una consulta algo como esto debería funcionar:

SELECT c.name, count(p.contact_id) 
FROM contacts AS c 
LEFT OUTER JOIN purchases AS p 
ON p.contact_id = c.contact_id 
GROUP BY c.contact_id 
ORDER BY c.name ASC 

Esta consulta pondrá el recuento en una columna separada, que recomiendo. Si debe formatearlo de la manera que indicó con los paréntesis después del nombre, puede usar la función concat() de MySQL. Algo como esto:

SELECT concat(c.name, '(', count(p.contact_id), ')') AS Name_And_Count_Together 
FROM contacts AS c 
LEFT OUTER JOIN purchases AS p 
ON p.contact_id = c.contact_id 
GROUP BY c.contact_id 
ORDER BY c.name ASC 
+1

Muchas gracias, que funcionó a las mil maravillas. Me alegro de haber publicado aquí, bc, nunca lo hubiera averiguado por mi cuenta. Gracias de nuevo. – user982853

+0

¿Es posible agregar la fecha de la última compra a la primera consulta? – ipel

+1

@ipel Sure. Puede agregar algo como max (p.purchase_date) a la lista de selección. – Asaph

0

La consulta requerida sería algo como esto (no sé su esquema):

SELECT c.name, count(p.id) FROM contacts c 
JOIN purchases p ON (c.id = p.id) 
GROUP BY p.id 
ORDER BY contacts.name ASC 
+2

Una unión externa sería aconsejable para que pueda incluir contactos con cero compras también. – Asaph

+1

Sí, tiene razón –

1
SELECT contacts.name, COUNT(*) 
    FROM contacts, purchases 
    WHERE contacts.name = purchases.name 
GROUP BY purchases.key 
ORDER BY contacts.name 

Reemplazar .name en la cláusula WHERE con la clave que está utilizando para identificar los registros.

+1

Una unión externa sería aconsejable para que pueda incluir también contactos con cero compras. – Asaph

+1

Ah, buen punto gracias – kz3

Cuestiones relacionadas