【问题标题】:How to count the results of a where clause in order to calculate a proportion a MYSQL select clause?如何计算where子句的结果以计算MYSQL select子句的比例?
【发布时间】:2016-04-28 21:03:45
【问题描述】:

我从这个查询开始,它返回了 8 条具有“已声明”状态的记录。我正在查看invites-from-address 列中的任何地址是否与moves-from-address 列中的地址不同:

SELECT i.id, i.company_id, i.status,  
  ia_f.base_street as "invites-from-address", a_f.base_street as "moves-from-address", 
  ia_t.base_street as "invites-to-address", a_t.base_street as "moves-to-address", i.`mover_first_name`, 
  i.mover_last_name, i.`to_address_id`

FROM invites i
JOIN moves m ON i.id = m.`claimed_invite_id`
JOIN `invite_addresses` ia_f ON ia_f.id = i.`from_address_id`
JOIN addresses a_f ON a_f.id = m.from_address_id

JOIN `invite_addresses` ia_t ON ia_t.id = i.to_address_id
JOIN addresses a_t ON a_t.id = m.to_address_id

WHERE i.`company_id` = 1040345
GROUP BY id

我在下面的这个查询中试图做的是动态创建一个average_discrepancy 列,显示invites-from-addressmoves-from-address 之间不同地址的比例。我能够通过使用WHERE 子句来成功检查地址差异,该子句检查ia_f.base_street 不等于a_f.base_street(分别别名为invites-from-addressmoves-from-address 列)但是当我把这个我的SELECT 中的count 函数内的WHERE 子句导致它不起作用。是因为我不能将WHERE 子句放在SELECTcount 函数或两者中?在我的SELECT 子句中尝试划分对count 函数的两次调用的结果是否也存在问题?

SELECT i.id, i.company_id, i.status, 
  count(WHERE ia_f.base_street != a_f.base_street)/count(i.status="claimed") as "average_discrepancy", 
  ia_f.base_street as "invites-from-address", a_f.base_street as "moves-from-address", 
  ia_t.base_street as "invites-to-address", a_t.base_street as "moves-to-address",
  i.`mover_first_name`, 
  i.mover_last_name, i.`to_address_id`

FROM invites i
JOIN moves m ON i.id = m.`claimed_invite_id`
JOIN `invite_addresses` ia_f ON ia_f.id = i.`from_address_id`
JOIN addresses a_f ON a_f.id = m.from_address_id

JOIN `invite_addresses` ia_t ON ia_t.id = i.to_address_id
JOIN addresses a_t ON a_t.id = m.to_address_id

WHERE i.`company_id` = 1040345

AND i.status = "claimed" 

【问题讨论】:

    标签: mysql select subquery


    【解决方案1】:

    您需要将其放入 SUM 而不是 COUNT。像这样的东西可以解决问题:

     SELECT i.id, i.company_id, i.status, 
      SUM(CASE WHEN ia_f.base_street != a_f.base_street THEN 1 ELSE 0 END)/ SUM(CASE WHEN i.status='claimed' THEN 1 ELSE 0 END) as 'average_discrepancy', 
      ia_f.base_street as 'invites-from-address', 
      a_f.base_street as 'moves-from-address', 
      ia_t.base_street as 'invites-to-address', 
      a_t.base_street as 'moves-to-address',
      i.mover_first_name, 
      i.mover_last_name, 
      i.to_address_id
    
    FROM invites i
    JOIN moves m ON i.id = m.claimed_invite_id
    JOIN invite_addresses ia_f ON ia_f.id = i.from_address_id
    JOIN addresses a_f ON a_f.id = m.from_address_id
    
    JOIN invite_addresses ia_t ON ia_t.id = i.to_address_id
    JOIN addresses a_t ON a_t.id = m.to_address_id
    
    WHERE i.company_id = 1040345
    
    AND i.status = 'claimed'
    

    【讨论】:

    • 做到了!后续问题,如果我只想显示具有地址差异的记录,我必须使用哪种子句?有没有办法在这个条件的基础上实现这个期望的结果?
    • 您可以将其包装在另一个 SELECT 语句中,以仅提取您想要显示的记录。将此查询更改为仅显示这些记录的问题是,如果我们更改查询返回的内容,您的 SUM 操作将会更改。如果它被包装在另一个查询中,它看起来像这样:'SELECT sub.id, sub.company_id, sub.status, sub.average_discrepancy, sub.invites_from_address, move_from_address, move_to_address, sub.mover_first_name, sub.mover_last_name, sub。 to_address_id FROM ( -- Original Query go here ) AS sub WHERE sub.base_street != sub_f.base
    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多