【问题标题】:Making two SQL queries into one将两个 SQL 查询合二为一
【发布时间】:2014-06-23 17:36:38
【问题描述】:

如何在一个查询中执行这两个查询,以便显示具有超过 2 个值的 eid 并同时显示其 eid?

select eid, count(Edited_by.eid)
from Edited_by
group by eid;


select Editor.eid  
from Editor 
where ( select count(*) 
    from Edited_by 
    where Edited_by.eid=Editor.eid ) > 2;

【问题讨论】:

    标签: mysql sql select count


    【解决方案1】:

    更新


    HAVING 子句中的谓词可以对聚合表达式进行操作。我想你可能正在寻找这样的东西:

    SELECT t.eid
         , COUNT(t.eid) AS cnt
      FROM Edited_by t
     GROUP BY t.eid
    HAVING COUNT(t.eid) > 2
    

    哎呀。我完全错过了这两个查询引用了两个不同的表。

    要同时引用Editor 表,您可以将上面的查询用作内联视图。

    SELECT c.eid                  AS edited_by_eid
         , c.cnt                  AS cnt
         , IF(c.cnt>2,e.Eid,NULL) AS editor_eid
      FROM Editor e
      JOIN ( SELECT t.eid
                  , COUNT(t.eid) AS cnt
               FROM Edited_by t
              GROUP BY t.eid
           ) c
        ON c.eid = e.Eid
    

    跟进

    问:“我想通过运行一个来获得两个查询的结果。”

    答:我不完全理解您想要实现的目标。

    要返回两个单独的结果集,您需要运行两个单独的语句。 MySQL 可以从一个存储过程返回多个结果集,例如,一个过程可以执行两个查询。客户端可以处理这两个结果集(如果客户端接口库支持并启用)。这将是一个“单一语句”(CALL my_procedure;)。

    如果您想连接两个单独查询的结果,您可以使用 UNION ALL 集合运算符。通常,我会返回一个鉴别器列来区分哪个查询返回了哪些行。为此,列数和每列的数据类型必须在两个查询之间匹配。

    在您给出的示例中,来自编辑器表的查询需要返回一个虚拟整数类型列才能连接两个结果。

    SELECT t.eid
         , COUNT(Edited_by.eid) AS cnt
      FROM Edited_by t
     GROUP BY t.eid
     UNION ALL
     SELECT e.eid
          , 0 AS cnt
       FROM Editor e
      WHERE ( SELECT COUNT(*)
                FROM Edited_by c
               WHERE c.eid=e.eid 
            ) > 2
    

    【讨论】:

    • 您的第一个查询似乎有效。我不需要加入 EXACT 2.. 但我想通过运行一个来获得两个查询的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多