2011-08-12 26 views
12

En la tabla mysql info tengo:Seleccionar una fila sin entradas duplicadas

de identificación, nombre, ciudad, fecha, estado

Quiero seleccionar todos los nombres de "información" Hacer el consulta

$query = mysql_query("SELECT name FROM info WHERE status = 1 ORDER BY id") 
     or die(mysql_error()); 

while ($raw = mysql_fetch_array($query)) 
{ 
    $name = $raw["name"]; 
    echo ''.$name.'<br>'; 
} 

Bueno, el resultado es que devuelve todas las entradas. Quiero repetir todas las entradas sin duplicados.

Dicho: en raw "name" hemos insertado el nombre "John" 10 veces.
Quiero hacer eco solo una vez. ¿Esto es posible?

Respuesta

30

Es bastante simple:

SELECT distinct name FROM info WHERE status = 1 ORDER BY id 

La palabra clave de SQL DISTINCT hace el truco.

+0

Gran respuesta, gracias @ Bohemian ♦ –

2

añadir GROUP BY name a su SQL Statment - esto sólo traerá de vuelta a uno de cada entrada de la columna de nombre

+0

Cuando se aplica el nombre GROUP BY, ¿solo toma la primera fila? si la orden es por ID? – YumYumYum

+1

@YumYumYum la orden no está garantizada a menos que agregue la instrucción 'order by' – ManseUK

+0

Gracias por lo tanto, por seguridad utilicé este' SELECT id, duplicate_name, duplicate_email from SERVICE donde duplicate_email='[email protected] 'GROUP BY duplicate_email ORDER BY id ', que me da la fila cuando ese usuario ya se inscribió y la próxima vez que inicie sesión de nuevo en ese proyecto en particular – YumYumYum

5

Cambio

SELECT name FROM info WHERE status = 1 ORDER BY id 

a

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id 

Observe se añadió que GROUP BY. Más sobre el grupo por http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

Editar:
de nombre con el número de apparences tratar

SELECT name, count(name) FROM info WHERE status = 1 GROUP BY name ORDER BY id
+0

funciona, pero si quiero hacer un juego de palabras después del" nombre "el número de entradas como' código 'echo' '. $ nombre.' (veces)'; – Darius

0

uso GRUPO POR nombre comunicado

$query = mysql_query("SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id") or  die(mysql_error()); 

while ($raw = mysql_fetch_array($query)) { 
       $name = $raw["name"]; 
       echo ''.$name.'<br>'; 
       } 
12

trate de usar esto como su consulta:

SELECT DISTINCT name FROM info WHERE status = 1 ORDER BY id 

para obtener nombres distintos

o como otro uso sugerido GROUP BY

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY id 

creo que el primero es más intuitivo y no hay gran diferencia de rendimiento entre el EDITAR dos

como OP quiere también la cantidad de nombres aquí que vamos:

SELECT name,COUNT(id) AS n_names 
FROM info WHERE status = 1 
GROUP BY name 
ORDER BY name 

que pueda ORDER BYnamen_names o dependiendo de lo que necesita

+0

+1 usted fue unos segundos más rápido que yo :) – Bohemian

0

Esto funciona para mí, devuelve los nombres de tabla para una base de datos determinada.

my $sql="select distinct table_name from COLUMNS where table_schema='$database'" 
my $sth = $dbht->prepare($sql) 
     or die "Cannot prepare SQL statement: $DBI::errstr\n"; 
    $sth->execute 
     or die "Cannot execute SQL statement: $DBI::errstr\n"; 

    if ($DBI::err){ 

    $msg= "Data fetching terminated early by error: $DBI::errstr"; 

} 


while (@col=$sth->fetchrow_array()){ 
    $table[$i]=$col[0]; 
    $i++; 
}  
0

Digamos que está enviando sms masivos y no desea enviar el mismo mensaje dos veces al mismo tipo John. Lo que descubrí es que usar el truco de GROUP BY y ORDER BY al mismo tiempo funciona perfectamente. Pero no digo que sea la mejor manera. Aquí es cómo se puede usar u

SELECT name FROM info WHERE status = 1 GROUP BY name ORDER BY name 

EDIT: Esto es importante tener en cuenta, cuando se necesita más que una sola columna y hay valores son únicos para cada fila, entonces el DISTINCT no estaba ayudando.

+1

+1 esto es CORRECTO en mi caso. Porque tuve que tomar 'SELECT ID, nombre, correo electrónico de SIGNUP donde grupos = 'admin' Grupo por correo electrónico ORDER by id' – YumYumYum

+0

Sí, yo también lo probé y trabajé – humphrey

0

$ sql = "SELECCIONAR el nombre DISTINCT FROM status = 1 GROUP BY nombre ORDER BY name";

$query = mysqli_query($conn,$sql); 
<?php while ($fire=mysqli_fetch_array($query)) { ?> 
<h4><?php echo $query['name']; ?><br></h4> 
<?php } ?> 
Cuestiones relacionadas