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

我怎么能得到这个的?上述查询返回的错误: 操作数应包含1column(s)

本来准备报告的一个项目从所有表返回活动,活跃,共记录表。如果这种方法是错误的,那么我应该怎么用?任何建议。

有帮助吗?

解决方案

子查询只能返回一列。你要么需要做多个子查询,联接,或在一个子查询便宜的CONCAT黑客(CONCAT_WS(',', SUM(IF(status = 'Active', 1,0)), SUM(IF(status = 'Inactive', 1,0)))。

其他提示

由于错误说,你选择一个子查询返回两列。

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;

由于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

通过布局查询的,因为我只是做在这个问题,它会变得非常明显,别名tot_university,例如,将相关的两个列,这是不可能的...

除了这种语法/逻辑错误,整个查询似乎不佳的结构,以产生期望的结果。

它看起来非常像家庭作业,或者自分配的学习,因此我不会破坏它与现成的查询,而不是在这里是一些提示。

  • 该信息来自两个不同的,无关的表格,可能使联盟获得的结果在一个单一的查询(同时有效地运行两个查询)(然后将使用一个额外的列有一些文本,如'大学',"公共"来区分这两条线)
  • 总和(如果列=x,1,0)被一个很好的招数特定的价值观,而不必做一个集团由,实质上的"滚动"的计算中的一个步骤。
  • concat()伎俩是好的,如果你的重点是专门在文字型的结果,例如编写,因为-是的,一个报告,否则,最好是保持成果,在分开列的,用于进一步处理,显示在表等等。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top