24 de abril de 2009

Cómo quitar registros duplicados de un SELECT

En las estadísticas del blog aparecen varias entradas de gente que ha accedido al mismo buscando algo así como "select mysql quitar registros duplicados"... Entiendo que lo que buscaban era la forma de evitar que aparezcan registros (filas) repetidos al realizar en el conjunto de resultados. Así que hoy vamos a ver cómo conseguirlo. Es tan sencillo (cuando se conoce, claro está) como aplicar DISTINCT en la consulta.

Vamos a verlo con un ejemplo. Utilizaré la base de datos World. Supongamos que quiero saber qué paises tienen ciudades que superen los 7.000.000 de habitantes:
mysql> use world
Database changed
mysql> SELECT country.name FROM country INNER JOIN city 
    -> ON CountryCode=Code WHERE city.population>7000000;
+--------------------+
| name               |
+--------------------+
| Brazil             | 
| United Kingdom     | 
| Indonesia          | 
| India              | 
| India              | 
| Japan              | 
| China              | 
| China              | 
| South Korea        | 
| Mexico             | 
| Pakistan           | 
| Turkey             | 
| Russian Federation | 
| United States      | 
+--------------------+
14 rows in set (0.00 sec)

Vemos como en el resultado aparecen paises repetidos (China, India...). Esto se debe a que por ejemplo hay dos ciudades chinas que superan esa cifra, y ese es el motivo de que este país aparezca dos veces (una por cada ciudad que cumpla con la condición population > 7000000).

Para evitar estas filas duplicadas usaremos DISTINCT. Veamos:
mysql> select DISTINCT country.name from country INNER JOIN city 
    -> ON CountryCode=Code where city.population>7000000;
+--------------------+
| name               |
+--------------------+
| Brazil             |
| United Kingdom     |
| Indonesia          |
| India              |
| Japan              |
| China              |
| South Korea        |
| Mexico             |
| Pakistan           |
| Turkey             |
| Russian Federation |
| United States      |
+--------------------+
12 rows in set (0.00 sec)

Así de simple ;-)