SELECCIONAR CUENTA (nombre DISTINTO), id, dirección de los usuarios
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
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;