使用另一个SELECT的COUNT进行SELECT

时间:2014-11-18 20:55:01

标签: mysql sql select

我在SQL中有一个表,它是用户登录网站的列表。它看起来很像:

id | date | status 
------------------

状态可以是0表示不办理登机手续,1表示办理登机手续,2表示不办理登机手续,3表示不办理登机手续。

我正在尝试构建一个列出status = 0所有行的单个查询,但也有一个COUNT,表示每个特定status = 3上有多少行id

这可能吗?

3 个答案:

答案 0 :(得分:7)

MySQL VERSION

只需加入由id加入的计数。

SELECT t.*, COALESCE(t1.status_3_count, 0) as status_3_count
FROM yourtable t
LEFT JOIN 
(   SELECT id, SUM(status=3) as status_3_count
    FROM yourtable
    GROUP BY id
) t1 ON t1.id = t.id
WHERE t.status = 0

注意:这是做布尔值(也就是计数).. 表达式返回true或false a 1或0.所以我总结那些以返回每个id的status = 3的计数

SQL SERVER VERSION

SELECT id, SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) as status_3_count
FROM yourtable
GROUP BY id

或只使用WHERE status = 3COUNT(id)

答案 1 :(得分:1)

尝试依赖子查询:

SELECT t1.*,
       (  SELECT count(*) 
          FROM sometable t2
          WHERE t2.id = t1.id 
            AND t2.status = 3
       ) As somecolumnname
FROM sometable t1
WHERE t1.status=0

答案 2 :(得分:0)

您可以使用联接。编写一个查询,将获得状态为零的所有行:

SELECT *
FROM myTable
WHERE status = 0;

然后,编写子查询以通过按ID分组来获取每个id的状态3的计数:

SELECT COUNT(*)
FROM myTable
WHERE status = 3
GROUP BY id;

由于你想要第一个表中的所有行(至少是我想象的那样),你可以像第二个表一样使用LEFT JOIN:

SELECT m.id, m.status, IFNULL(t.numStatus3, 0)
FROM myTable m
LEFT JOIN (SELECT id, COUNT(*) AS numStatus3
      FROM myTable
      WHERE status = 3
      GROUP BY id) t ON m.id = t.id
WHERE m.status = 0;

以上内容仅显示包含状态为0的ID的行的计数。希望这就是您要查找的内容。如果不是,请发布一些示例数据和预期结果,我会帮助您尝试联系它。这是一个SQL Fiddle示例。