Pregunta

Con PHP estoy tratando de ejecutar una consulta SQL y seleccionar columnas normales, así como COUNT.

$sql_str =  "select COUNT(DISTINCT name), id, adress from users";
$src = mysql_query($sql_str);

while( $dsatz = mysql_fetch_assoc($src) ){
    echo $dsatz['name'] . "<br>";
}

El problema es que cuando tengo " COUNT (nombre DISTINCT), " en mi consulta, solo devolverá la primera entrada. Cuando lo elimine, devolverá todas las entradas coincidentes de la base de datos.

Podría separarlo y hacer 2 consultas, pero estoy tratando de evitar esto debido a problemas de rendimiento.

¿Qué hago mal? Gracias, Mexx

¿Fue útil?

Solución

La capacidad de combinar columnas normales y funciones agregadas es una característica (errónea) de MySQL. Incluso puedes leer por qué es tan peligroso en la documentación de MySQL: https://dev.mysql.com/doc/ refman / 5.6 / es / group-by-extensions.html

Pero si realmente desea mezclar filas normales y un resumen en una sola consulta, siempre puede usar la instrucción UNION:

SELECT COUNT(DISTINCT name), null, null FROM users GROUP BY name --summary row
UNION
SELECT name, id, address FROM users --normal rows

Otros consejos

COUNT () es una función agregada, se agrega a los resultados del resto de su consulta. Si desea contar todos los nombres distintos y no solo los nombres asociados con el id y address que está seleccionando, entonces sí, tendrá que realizar dos consultas . Así es como funciona SQL.

Tenga en cuenta que también debe tener una cláusula group by al agregar. Creo que el hecho de que MySQL no lo requiera es horrible, y alienta los malos hábitos.

Por lo que entiendo, quieres obtener:

  • una línea por usuario, para obtener cada nombre / id / dirección
  • una línea para varios usuarios al mismo tiempo, para obtener el número de usuarios que tienen el mismo nombre.

Esto no es del todo posible, diría yo.


Una solución sería, como usted dijo, dos consultas ...

... O, en su caso, podría hacer el recuento en el lado de PHP, supongo.
es decir, no cuente en la consulta, pero use un bucle adicional en su código PHP.

Cuando tenga una cuenta () como parte de la lista de campos, debe agrupar el resto de los campos. En tu caso eso sería

select count(distinct name), id, adress from users group by id, adress
select count(distinct name), id, adress 
from users 
group by id, adress

Supongo que desea obtener todos los usuarios y el recuento total en la misma consulta.

Probar

  select name, id, address, count(id) as total_number 
    from users 
    group by name, id, address;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top