2016-03-20 44 views
2

我需要根据不同得到的hits总和ipMySQL的总和基于彼此不同科拉姆一个科拉姆算

到目前为止,这是我想出:

SELECT 
COUNT(DISTINCT `ip`) AS `total`, 
SUM(`hits`) AS `sum` 
FROM `stats`.`stats` 
WHERE `category`=? 
GROUP BY `date` 

的样本数据:

| category | ip | hits | date | 
| 11  | ip1 | 1000 | date1 | 
| 11  | ip2 | 1000 | date1 | 
| 11  | ip3 | 1000 | date1 | 
| 11  | ip4 | 1000 | date1 | 
| 11  | ip1 | 1000 | date1 | 

预期结果:

ip=4 
sum=4000 

我正在为

ip=4 
sum=5000 

但是,这是给整个IP点击,而是如果仅加不同的IP命中。

请建议一种方法来做到这一点。我宁愿做类似

SUM(CASE WHEN `ip` THAN `hits`) 
//or 
SUM(CASE WHEN IN(`ip`) THAN `hits`) 
//or 
SUM(CASE WHEN IF(`ip`) THAN `hits`) 

而不是子查询,因为我需要快速查询。 也使用array_unique PHP方面将对我有好处。

谢谢。

+0

您能否提供一些样本数据? – Wanderer

+0

你是什么意思“总结唯一不同的IP点击”?这与计算访问网站的不同IP有何不同? – Barmar

+0

@Ullas检查有关样本数据的更新 –

回答

2

你可以这样说:

SELECT count(s.ip) as cntIp,sum(s.hits) as sumHits 
FROM(
    SELECT DISTINCT t.ip,t.hits 
    FROM YourTable t) s 

但它看起来像你所提供的数据是不准确的,我看到你按日期,这意味着日期等于而不是在你的例子中date1,date2,date3 ...

所以:

SELECT s.date,count(s.ip) as cntIp,sum(s.hits) as sumHits 
FROM(
    SELECT DISTINCT t.ip,t.hits,t.date 
    FROM YourTable t) s 
GROUP BY s.date 

编辑:

SELECT s.date,count(s.ip) as cntIp,sum(s.hits) as sumHits 
FROM(
    SELECT t.ip,t.hits,t.date 
    FROM YourTable t 
    GROUP BY t.ip,t.hits,t.date) s 
GROUP BY s.date 
+0

更正的问题也可以在没有子查询的情况下完成吗? –

+0

@tallboy不是我能想到的,但第二个查询应该可以完美工作 – sagi

+0

可以使用'CASE WHEN'而不是子查询 –

0

你可以试试这个

SELECT 
    `ip` 
    COUNT(`ip`) AS `total`, 
    SUM(`hits`) AS `sum` 
FROM 
    `stats`.`stats` 
WHERE 
    `category`=? 
GROUP BY   
    `date`, 
    `ip` 
+0

相同的结果不会计算不同的点击 –

+0

因此,您可以先尝试Group By IP.I认为它会工作 –

+0

I首先需要分组,然后检查ip的 –

1

你需要编写一个返回每个IP /日的最小目标值的子查询。然后你可以总结这些。

SELECT date, count(*) as sum, sum(minhits) as hits 
FROM(
    SELECT ip, date, MIN(hits) AS minhits 
    FROM stats 
    WHERE category = ? 
    GROUP BY ip, date) AS subquery 
GROUP BY date