【问题标题】:MySQL; Get information from 3 table same timeMySQL;同时从 3 个表中获取信息
【发布时间】:2013-01-25 19:04:40
【问题描述】:

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

是否有任何 QUERY 可以运行以从所有这三个表中获取并计算所有“已使用”=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。

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

【问题讨论】:

    标签: mysql sql phpmyadmin


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

      • WHERE 是否不想在子查询中,否则没有used 列可供检查?
      • 嗯,三个表中有超过 180 万个条目,它落后于服务器。当查询 withmon 表只需要 0.004 秒即可给出结果。花那么多时间可以吗?
      【解决方案3】:

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

      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));
      

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

      【讨论】:

      • #1248 - 每个派生表都必须有自己的别名它给了我这个错误
      【解决方案4】:

      也许你想要这样:

      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
      

      【讨论】:

        【解决方案5】:

        直接的解决方案;

        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 for testing

        如果您在 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 for this example.

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-18
          • 2015-02-18
          • 1970-01-01
          • 2019-07-17
          • 1970-01-01
          • 2014-01-24
          • 2013-02-23
          相关资源
          最近更新 更多