2010-04-22 23 views
5
$activeQuery = mysql_query("SELECT count(`status`) AS `active` FROM `assignments` WHERE `user` = $user_id AND `status` = 0"); 
$active = mysql_fetch_assoc($activeQuery); 

$failedQuery = mysql_query("SELECT count(`status`) AS `failed` FROM `assignments` WHERE `user` = $user_id AND `status` = 1"); 
$failed = mysql_fetch_assoc($failedQuery); 

$completedQuery = mysql_query("SELECT count(`status`) AS `completed` FROM `assignments` WHERE `user` = $user_id AND `status` = 2"); 
$completed = mysql_fetch_assoc($completedQuery); 

Tiene que haber una mejor manera de hacerlo, ¿no? No sé cuánto necesito elaborar ya que puede ver lo que estoy tratando de hacer, pero ¿hay alguna manera de hacer todo eso en una sola consulta? Necesito poder dar salida a las asignaciones activas, fallidas y completadas, preferiblemente en una consulta.MySQL - ¿Cómo hacer esto mejor?

+3

* (de referencia) * http: // en. wikipedia.org/wiki/SQL_injection – Gordon

+2

No tomo ninguna entrada del usuario, sin embargo. – Andrew

+2

Depende de cómo obtendrá $ user_id. No viene directamente de una galleta, ¿verdad? – Tom

Respuesta

10

Puede intentar algo como esta consulta

SELECT Status , COUNT(*) StatusCount 
FROM assignments 
WHERE Status IN (0, 1, 2) 
AND User = $user_id 
GROUP BY Status 
+1

no se olvide $ user_id – kenwarner

+1

+1 Esto es mejor que mi solución ya que selecciona solo los 3 estados que indicó en su pregunta. Había asumido que solo había 3. – hookedonwinter

+1

Eso funcionó muy bien. No tengo idea de cómo, pero lo hizo. >.> – Andrew

2

Prueba esta edición

$activeQuery = SELECT status, count(status) as "status count" FROM `assignments` WHERE `user` = $user_id GROUP BY `status` 

: agregado grupo por

0

En vez de hacer de forma individual se puede utilizar la siguiente instrucción SQL única

SELECT count(*), `status` 
FROM `assignments` 
WHERE `user` = $user_id 
    AND `status` in (0,1,2) 
GROUP BY `status` 
ORDER BY `status` 

El ciclo alrededor del conjunto de resultados para extraer los resultados.

0

Usa el GROUP BY para obtenerlo en una consulta, pero en filas separadas.

$query = mysql_query("SELECT `status`, count(*) AS `num` FROM `assignments` WHERE `user` = $user_id AND `status` in (0,1,2) GROUP BY `status` ORDER BY `status` ASC"); 
$active_count = 0; 
$failed_count = 0; 
$completed_count = 0; 
while ($array = mysql_fetch_assoc($query)) 
{ 
    if ($array['status'] == 0) 
     $active_count = $array['num']; 
    else if ($array['status'] == 1) 
     $failed_count = $array['num']; 
    else if ($array['status'] == 2) 
     $completed_count = $array['num']; 
} 
+1

Esto no funciona. Por ejemplo, si no hay registros de estado = 1, la cuenta fallida obtendrá el valor de estado = 2 y la cuenta completed (dependiendo de la configuración error_report) será nula o causará un error ya que $ completed_array devuelto por mysql_fetch_assoc será una booleana falsa, no una matriz. – jmucchiello

+0

Buen punto: eso es lo que recibo por responder con prisa. ¿Qué tal esta nueva versión? – Dathan

0
SELECT 
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 0) AS active, 
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 1) AS failed, 
(SELECT COUNT(*) FROM `assignments` WHERE `user` = $user_id AND `status` = 2) AS completed, 
FROM `assignments` 
GROUP BY active, failed, completed 

no ha obtenido el marcado, pero esto es cerca o lo suficientemente cerca.

0

Cuando tengo la opción, tengo la costumbre de usar declaraciones preparadas para ayudar a proteger contra la protección de inyección sql y para la eficacia (requires using mysqli).

Pero si esto no es una opción, entonces

SELECT 
    CASE `status` 
     WHEN 0 THEN `active` 
     WHEN 1 THEN `failed` 
     WHEN 2 THEN `completed` 
     ELSE `unknown` 
    END 
    AS `statuslabel`, 
    COUNT(status) 
    AS `statuscount` 
FROM `assignments` 
WHERE `user` = $escaped_user_id 
GROUP BY `statuslabel` 
ORDER BY `statuslabel` 

Nota el uso de la $escaped_user_id, que sería creado de antemano:

$escaped_user_id = mysql_real_escape_string($user_id); 
Cuestiones relacionadas