Php MySQL——如何做得更好?

Php MySQL——如何做得更好?,php,sql,mysql,Php,Sql,Mysql,一定有更好的办法,对吧?我不知道我需要详细说明多少,因为您可以看到我正在尝试做什么,但是有没有办法在一个查询中完成所有这些?我需要能够输出活动的、失败的和完成的作业,最好在一个查询中输出。试试这个 $activeQuery = mysql_query("SELECT count(`status`) AS `active` FROM `assignments` WHERE `user` = $user_id AND `status` = 0"); $active = mysql_fetch_ass

一定有更好的办法,对吧?我不知道我需要详细说明多少,因为您可以看到我正在尝试做什么,但是有没有办法在一个查询中完成所有这些?我需要能够输出活动的、失败的和完成的作业,最好在一个查询中输出。

试试这个

$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);

编辑:添加分组依据

您可以尝试类似此查询的操作

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

您可以使用以下SQL语句,而不是单独执行这些操作

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

围绕结果集的循环以提取结果。

使用
分组依据
在一个查询中,但在单独的行中获取结果

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

还没有检查标记,但这已经很接近了。

当我有选择的时候,我习惯使用prepared语句来帮助防止sql注入保护和提高效率

但如果这不是一个选项,那么

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
请注意将提前创建的的的使用:

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`

(参考)不过,我不接受任何用户输入。这取决于您如何获得$user\u id。它不是直接来自cookie,是吗?$user\u id是与用户表中与其登录时使用的用户名/密码匹配的行关联的id。我在用户名和密码以及所有其他用户输入上使用mysql_real_escape_string()。+1这比我的解决方案好,因为它只选择您在问题中陈述的3种状态。我以为只有3个,这不行。例如,如果没有status=1记录,则失败的_计数将获得status=2值,而完成的_计数(取决于错误报告设置)要么为null,要么导致错误,因为从mysql_fetch_assoc返回的$completed_数组将是一个布尔值false,而不是数组。这一点很好-这就是我在匆忙回答时得到的结果。这个新版本怎么样?
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 = mysql_real_escape_string($user_id);