【问题标题】:Mysql subquery adviceMysql子查询建议
【发布时间】:2020-04-25 21:59:45
【问题描述】:

希望有人可以就我正在尝试做的子查询提出建议。我仍在努力研究子查询。

这是我正在尝试运行的查询:

SELECT name (SELECT type AS User, count(*) As Number 
              from table 1 
              where event = 'answerall'
            ) from table 2

单独运行两个查询可以正常工作,但不能让它们一起工作。

我想获取表2的列名的内容并添加到表1中。

所以我有这样的查询:

Name  User  Number
Jimmy  7001    7

抱歉我试过了:

SELECT 
    name,
    (SELECT 
            type AS Agent, COUNT(*) AS Number
        FROM
            queue_log
        WHERE
            event = 'OUTANSWER')
FROM
    agents_conf

并得到错误“操作数应包含 1 列”

queue_log 表和agents_conf 互不相关,但在同一个数据库中

queue_log 表示例

uid  -  type        -  event
1    - Agent6001    - OUTANSWER
2    - Agent6002    - CONNECT
3    - Agent6001    - ABANDON 
4    - Agent5003    - OUTANSWER

在此处运行此查询可以正常工作:

SELECT type AS Agent, count(*) As Number from queue_log where event = 'OUTANSWER'

Agent.conf 表:

agent_number   - name   
6001           - Jim    
6002           - James       
6003           - John    

运行此查询运行良好,并为我提供所有名称的列表

SELECT name from agents_conf

【问题讨论】:

  • 可惜上面的格式不正确,应该是 Name Jimmy User 7001 Number 7
  • 那是无效的语法。 SELECT name (SELECT 语法不正确;至少它在name 之后缺少一个逗号,这会导致它无法运行。这不是您的实际 SQL,或者您遇到了一个您不想在问题中包含的错误。请edit 包含您的实际代码或包含exact 错误消息。您还可以在使用时修复代码格式;使用工具栏上的? 按钮获取有关如何操作的帮助。还包括两个表中的一些示例数据;
  • Running both queries on their own works fine. 这根本不是真的
  • 两张表是否相关?如果不是,那么查询的逻辑是什么。如果是怎么办?使用示例数据和预期结果编辑您的问题以进行澄清。
  • mysql 表示不允许返回两列。以这种方式进行这样的子查询,但我会看到产生 Jimmy 7001 7 的数据

标签: mysql subquery


【解决方案1】:

欢迎来到 S/O,尽管您似乎很早就受到了重创……不过不要担心。以后尽量用简单的英语解释一下你想得到什么,然后展示支持的表结构和各个表的示例数据。

现在,您似乎正在尝试根据每种类型的给定事件(在本例中为“OUTANSWER”)从日志文件中获取计数。该类型实际上代表一个用户(虽然听起来很奇怪)。然后,我需要每个类型(用户)的人名。 -- 或者至少是这样的,现在开始您的查询。

一次一个。您有所介绍,但更改了事件位置,使用与您提供的示例不匹配的表 1 和表 2 的引用。

关于数据,您的 queue_log 表的类型为 all 前缀(在此示例集中),前缀为“Agent”。这真的准确吗?因为在您的代理表中,您只有明显的基于整数的“ID”键。如果这是连接的情况,如果您尝试将整数与必须去除“代理”前缀的字符串进行比较,并且是否还有其他前缀用于其他目的,它将无法正常工作?

因此,鉴于所有这些事情,我希望您能提供澄清,我会尽力提供帮助。首先,给定事物的每个代理的计数......在这种情况下,如果“代理”确实是代理的前缀,我将从类型字段的字符串中预先去除“代理”。

select
      replace( ql.type, 'Agent', '' ) AgentID,
      count(*) AgentCount
   from
      queue_log ql
   where
      ql.Event = 'OUTANSWER'
   group by
      replace( ql.type, 'Agent', '' ) AgentID

这将返回 2 行。一个对应于不同代理的每个 Outanswer 记录,但至少 AgentID 列将分别只有 6001 和 5003,但仍然是一个字符串。现在,您想获取此人的姓名,因此您必须加入代理表。所以,我将把上面的查询作为主选择并为其分配一个别名,这样它就可以加入到代理表中来获取名称

select
      PreQuery.AgentID,
      PreQuery.AgentCount,
      a.Name
   from
      (select
            replace( ql.type, 'Agent', '' ) AgentID,
            count(*) AgentCount
         from
            queue_log ql
         where
            ql.Event = 'OUTANSWER'
         group by
            replace( ql.type, 'Agent', '' )) PreQuery
      JOIN Agent a
         on PreQuery.AgentID = a.agent_number

现在,如果您的 queue_log 带有 Agent + ID 前缀,我强烈建议将其分成两列,例如

QueueID   KeySource  KeyID   Event
1         Agent      6001    OUTANSWER
2         Agent      6002    CONNECT
3         Agent      6001    ABANDON
4         Agent      5003    OUTANSWER

通过这种方式,您可以将 KeyID 保留为整数,并且源标识它的来源。这将使未来的事情变得更加容易......

【讨论】:

  • 是的,我受到了打击,谢谢 DRapp 的详细回复,非常有帮助
  • @Patrickmysql,不客气,如果我有任何问题,请告诉我。您的表结构不应该像 Key ID 那样将事物合并在一起,因为从长远来看它只会带来巨大的痛苦。按照我的建议,分成两列是保留各自部分及其来源的一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
相关资源
最近更新 更多