0
SELECT
  ( SELECT
       SUM(IF(status = 'Active', 1, 0)) AS `univ_active`,
       SUM(IF(status = 'Inactive', 1, 0)) AS 'univ_inactive',
       Count(*)
    FROM online_university
  ) 
 AS tot_university,
( SELECT 
    SUM(IF(status = 'Active', 1,0)) AS `user_active`,
    SUM(IF(status = 'Inactive', 1,0)) AS 'user_inactive'
    Count(*)
  FROM online_register_user)
AS tot_users

结果必须是

univ_active=4 univ_inactive=2 tot_university=6
user_active=10 user_inactive=3 tot_users = 13

我怎样才能得到这个?上面的查询返回 ERROR: Operand should contain 1 column(s)

这是为了从所有表中为项目准备报告,从表中返回 Active、Inactive、Total 记录。如果这种方法是错误的,那么我应该使用什么?任何建议。

4

4 回答 4

3

子查询只能返回一列。您需要在单个子查询中执行多个子查询、连接或廉价的 concat hack ( CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0)))。

于 2009-11-23T05:08:15.867 回答
2

正如错误所说,您正在选择一个返回两列的子查询。

SELECT (one_thing, another_thing) AS combined_thing

SQL 中不存在。您必须将每个子查询单独放置:

SELECT (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_university
) AS univ_active, (
    SELECT SUM(IF(status='Inactive', 1, 0)) FROM online_university
) AS univ_inactive, (
    SELECT SUM(IF(status='Active' OR status='Inactive', 1, 0)) FROM online_university
) AS tot_university, (
    SELECT SUM(IF(status='Active', 1, 0)) FROM online_register_user
) AS user_active, (
    -- and so on

但是,在单个查询中完成所有这些操作并没有任何好处。说起来容易得多:

SELECT COUNT(*) FROM online_university WHERE status='Active';  -- univ_active
SELECT COUNT(*) FROM online_university WHERE status='Inactive';  -- univ_inactive
SELECT COUNT(*) FROM online_university;  -- tot_university
SELECT COUNT(*) FROM online_register_user WHERE status='Active';  -- user_active
    -- and so on

然后将这些结果一起呈现在应用层中。WHERE 子句更快,并且可以使用像 SUM/IF 这样的计算表达式不能使用的正确索引。

更简单:

SELECT status, COUNT(*) FROM online_university GROUP BY status;
SELECT status, COUNT(*) FROM online_register_user GROUP BY status;
于 2009-11-23T05:19:17.550 回答
1

通过像我在问题中所做的那样布局查询,很明显别名 tot_university,例如,将与两列相关联,这是不可能的......

除了这个语法/逻辑错误之外,整个查询的结构似乎很差,无法产生所需的结果。

它看起来很像家庭作业或自分配学习,所以我不会用现成的查询来破坏它,而是这里有一些提示。

  • 信息来自两个不同的、不相关的表,可能使用 UNION 在单个查询中获取结果(同时有效地运行两个查询)(然后您将使用带有“Univ”、“Public”之类的文本的额外列来区分两者行)
  • SUM(IF column = x, 1,0) 是计算特定值的好技巧,无需进行分组,基本上是一步“汇总”计数。
  • 如果您只关注文本类型的结果,例如在报告中按原样编写,则 concat() 技巧很好,否则,最好将结果保存在单独的列中,以便进一步处理,显示在表等...
于 2009-11-23T05:12:33.937 回答
1

正如 BipedalShark 所说,您的查询应该有 1 列,现在有 2 列。但除此之外,您应该考虑使用 count(*) 和 where 子句。所以它应该是这样的:

select
 (select count(*) from online_university where status = 'Active') as univ_active,
 (select count(*) from online_university where status = 'Inactive') as univ_inactive,
 (select count(*) from online_register_user where status = 'Active') as user_active,
 (select count(*) from online_register_user where status = 'Active') as user_inactive
于 2009-11-23T05:15:13.730 回答