什么是错误的,在我MYSQL查询?
-
21-09-2019 - |
题
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()伎俩是好的,如果你的重点是专门在文字型的结果,例如编写,因为-是的,一个报告,否则,最好是保持成果,在分开列的,用于进一步处理,显示在表等等。
不隶属于 StackOverflow