1

人们

这是我的小问题。我有三个表: a_names_1 b_names_2 c_names_3 它们的结构相同。他们都有两个项目:名称和使用

是否有任何查询可以运行以从所有这三个表中获取并计算所有“已使用”=1 的“名称”。

我试过这个,但没有奏效:

(SELECT COUNT(*) 'name' from a_names_1) UNION 
(SELECT COUNT(*) 'name' from a_names_2) UNION 
(SELECT COUNT(*) 'name' from a_names_3) WHERE `used`=1

我正在为 MySQL 使用 PHPMyAdmin。

任何帮助将不胜感激..在此先感谢

4

5 回答 5

1

names此查询输出与所有表不同的计数used=1

select count(distinct name)
from
(
select name,used from a_names_1 where used=1
union all
select name,used from a_names_2 where used=1
union all
select name,used from a_names_3 where used=1
)  t

如果您需要对所有表中的每个 NAME 的所有 USED 进行 SUM 并仅使用 SUM of used=1 输出,则:

select count(*) from
(
select name, SUM(used)
from
(
select name,used from a_names_1
union all
select name,used from a_names_2
union all
select name,used from a_names_3
)  t
GROUP BY name
HAVING SUM(used)=1
) t1
于 2013-01-25T10:10:32.193 回答
0
select count(*) as name 
from 
(
select name, used from a_names_1
union 
select name, used from a_names_2
union
select name, used from a_names_3) t
where t.used = 1
于 2013-01-25T10:08:48.740 回答
0

可能这很慢,因为您失去了索引优化。我要做的是做三个查询,比如

SELECT SUM('name') AS name_sum
FROM ((SELECT COUNT(*) 'name' from a_names_1 WHERE `used`=1) 
     UNION (SELECT COUNT(*) 'name' from a_names_2 WHERE `used`=1));

如果这不起作用,则可能是名称的使用有问题

于 2013-01-25T10:11:19.920 回答
0

也许你想要这样:

select count(*) as cnt
from 
(
    select name from a_names_1 t1 where t1.used = 1
    union 
    select name from a_names_2 t2 where t2.used = 1
    union
    select name from a_names_3 t3 where t3.used = 1
) t
于 2013-01-25T10:11:42.030 回答
0

直接的解决方案;

SELECT SUM(used) FROM (
  SELECT used FROM a_names_1 WHERE used=1
  UNION ALL
  SELECT used FROM a_names_2 WHERE used=1
  UNION ALL
  SELECT used FROM a_names_3 WHERE used=1
) a

用于测试的 SQLfiddle

如果您有一个索引used(并且 used 的唯一值是 0 或 1),另一种方法是使用索引进行计数;

SELECT SUM(used) total FROM (
  SELECT SUM(used) used FROM a_names_1
  UNION ALL
  SELECT SUM(used) FROM a_names_2
  UNION ALL
  SELECT SUM(used) FROM a_names_3
) a

此示例的 SQLfiddle

如果查看后一个查询的查询计划,您会发现它有效地使用了索引。

于 2013-01-25T10:13:33.557 回答