2011-01-27 55 views
7

Tengo dos tablas a las que intento unirme. Uno contiene una lista de clientes, el otro es una lista de pedidos. Estoy tratando de formular una consulta que me permitirá seleccionar todos los clientes que figuran en la tabla clientes que tienen al menos un pedido en la tabla pedidos. Sin embargo, no quiero obtener duplicados para aquellos clientes que tienen pedidos múltiples. ¿Alguna sugerencia de cómo puedo lograr esto?MySQL - ¿Unir dos tablas sin duplicados?

Sé que esto es probablemente un problema común, sin embargo no tengo idea de cómo se llamaría este tipo de consulta para poder buscar una respuesta. Cualquier sugerencia sería muy apreciada. Gracias.

+0

¿Has probado con ** DISTINCT **? – FeRtoll

Respuesta

10

Es mucho más sencillo de lo que piensa:

select distinct(customer_id) from orders;

Editar: Si realmente desea obtener la información completa sobre el cliente,

select * from customers where customer_id in (select distinct(customer_id) from orders);

+0

Gracias, parece que tendrá más posibilidades de éxito. Dado que las tablas de clientes y pedidos son tan grandes (registros de 180 mil en clientes, 70 millones en pedidos) utilizando distintos, especialmente en clientes, es problemático. – Wige

+1

No creo que lo distinto sea necesario en la subconsulta: compruebe el PLAN EXPLICADO con y sin él para ver si hay alguna diferencia. –

+0

De acuerdo. Yo sin pensar copiar/pegar desde la primera consulta. –

1
select customers.id, customers.name, count(orders.id) 
from customers 
    inner join orders on orders.customer_id = customers.Id 
group by customers.id, customers.name 
having count(orders.id) > 0 
+0

Si todo lo que devuelve es customer_id y la cantidad de pedidos, no es necesario que se una. 'select customer_id, count (*) del grupo de pedidos por customer_id' hará el truco. –

+0

@Michael: ¿Ya cambié eso? –

+0

Oh, no lo noté. –

0
SELECT 
    c.id, 
    c.name 
FROM 
    customer c 
    INNER JOIN order o ON o.customer_id = c.id 
GROUP BY 
    c.id, 
    c.name 
HAVING 
    COUNT(o.id) >= 1 

No puedo recordar si HAVING o GROUP BY son los primeros.

5

Uso:

SELECT c.* 
    FROM CUSTOMERS c 
WHERE EXISTS (SELECT NULL 
       FROM ORDERS o 
       WHERE o.custeromid = c.id) 

La cláusula IN es una alternativa, sino que existe funciona mejor para los duplicados porque devuelve verdadero en el primer duplicado por lo que no procesa toda la tabla.

+0

¿No será mejor (mucho) mejor si hay un índice en 'o.customerid'? –

+0

@Klaus Byskov Hoffmann: Tendría que probar y ver, pero salir en el primer partido me suena mejor que compararlo con todo. El tipo de datos también podría desempeñar un papel. –

+0

Sí, estoy de acuerdo en que salir en el primer partido probablemente sea casi siempre mejor. Estaba pensando en el peor de los casos y solo pregunté por interés teórico :-) –