2010-04-22 3 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); 

Должен быть лучший способ сделать это, не так ли? Я не знаю, сколько мне нужно разработать, поскольку вы можете видеть, что я пытаюсь сделать, но есть ли способ сделать все это в одном запросе? Мне нужно иметь возможность выводить активные, неудачные и завершенные задания, предпочтительно в одном запросе.MySQL - Как это сделать лучше?

+3

* (ссылка) * HTTP: // эн. wikipedia.org/wiki/SQL_injection – Gordon

+2

Я не принимаю ни одного пользователя. – Andrew

+2

Зависит от того, как вы получаете $ user_id. Это не идет прямо из печенья, не так ли? – Tom

ответ

10

Вы можете попробовать что-то вроде этого запроса

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

не забудьте $ user_id – kenwarner

+1

+1 Это лучше, чем мое решение, поскольку оно выбирает только 3 статуса, которые вы указали в своем вопросе. Я предположил, что есть только 3. – hookedonwinter

+1

Это отлично поработало. Не знаю, как это сделать. >.> – Andrew

2

Попробуйте редактировать

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

: добавлена ​​группа по

0

Вместо того чтобы делать их по отдельности, вы можете использовать следующий один оператор SQL

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

Петля вокруг результирующего набора для извлечения результатов.

0

Используйте GROUP BY, чтобы получить его одним запросом, но на отдельных страницах.

$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

Это не работает. Например, если нет статусов = 1 записей, fail_count получит значение status = 2, а complete_count (в зависимости от параметра error_report) либо будет null, либо вызовет ошибку, так как $ completed_array, возвращаемый из mysql_fetch_assoc, будет логическим false, а не массив. – jmucchiello

+0

Хорошая точка - это то, что я получаю за то, что я спешу. Как насчет этой новой версии? – 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 

не проверили разметку, но это близко или достаточно близко.

0

Когда у меня есть опция, я привык использовать подготовленные инструкции, чтобы защитить защиту от вторжения в sql-инъекцию и для эффективности (requires using mysqli).

Но если это не вариант, то

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` 

Обратите внимание на использование $escaped_user_id, которая будет создана заранее:

$escaped_user_id = mysql_real_escape_string($user_id); 
Смежные вопросы