如何解决这个MySQL拼图?

时间:2018-04-10 04:16:58

标签: mysql sql

当前的sql:

SELECT
    clientId,
    groupID, 
    COUNT(DISTINCT clientId) AS visitors,
    ROUND(AVG(price),2) AS price
FROM  
(
    SELECT `devices`.*, MAX(`url`.price) AS price 
    FROM `devices`, `url` 
    WHERE `devices`.visited_url = `url`.website
) devices
GROUP BY `devices`.groupID
  • url table每个价格都有很多网站。
  • 设备表是人们使用移动设备访问某个网站并且该网站存在于网址表中的记录。
  • 我想获取设备中访问网址的平均值

设备表数据:

id   clientId   device   groupId  visited_url
 1   client1    samsung      123  fb.com
 2   client1    samsung      123  google.com
 3   client1    samsung      123  fb.com
 4   client1    samsung      123  fb.com
 5   client2    iphone       123  google.com
 6   client2    iphone       123  google.com

网址表数据:

id     website    price
 1     fb.com        $1
 2     google.com    $2

我想得到visited_url的价格

尝试过这种方法:

ROUND(AVG(MAX(value)),2) AS value

得到了这个错误:

  

Error Code: 1111. Invalid use of group function

问题是:如何将ROUND()AVG()MAX()合并为一行?

我想要的结果是:

clientId  groupID   website     visitors  price
client1       123   fb.com             3     $3 (avg)
client1       123   google.com         1     $2 (avg)
client2       123   google.com         2     $4 (avg)

2 个答案:

答案 0 :(得分:0)

您似乎只想要一个JOINGROUP BY。根据您想要的结果:

SELECT clientId, groupID, COUNT(*) AS visitors,
       ROUND(SUM(price), 2) AS price
FROM devices d JOIN
     url u
     ON d.visited_url = u.website
GROUP BY clientId, groupID;

答案 1 :(得分:-1)

所以,你不能得到max()的舍入平均值......因为max是一回事,任何平均值都是自己的。现在,你能做的就是这个......

SELECT ROUND(AVG(value), 2), MAX(value) FROM tableName

注意:'价值'是你的COLUMN名字。 '表名'显然是你的表名:)

然后你只需将其绑定为2个结果......第一个结果将是'值的舍入平均值'柱。第二个结果是舍入的最大值'值'柱。

但不幸的是,当你使用MAX()时,你会说"告诉我这里的最大值是什么。"这会将您限制为1个结果,但AVG()希望获得整列的平均值,就像MAX()函数一样......因此它具有无效的分组。